Komplettes Verzeichniss kopieren
-
Hat jemand ne Idee, wie ich ein komplettes Verzeichnis Kopieren kann (also ne Funktion, an die der Verzeichnispfad und der Zielpfad übergeben werden)??
Das Programm, für das das ist, befindet sich auf einer CD und wird aufgerufen und soll dann an einen übergebenen Pfad ein Verzeichnis von der CD kopieren.
(Arbeite mit Borland C++ Builder Standard)
-
Ich kann Dir das nur als WinAPI/MFC-Schnippsel geben, aber das Prinzip stimmt:
Diese Funktion gibt Dir die Anzahl Dateien im angegebenen Quellpfad zurück, z.B. um später einen Kopierzustand in Prozent angeben zu können oder einfach zur Kontrolle:
long CountFiles(CString pstrSourcePath) { BOOL bMore; WIN32_FIND_DATA wfd; HANDLE handle; CString szMask; CString szFullName; szMask = pstrSourcePath + "\\*.*"; //Suchmaske für FindFirstFile handle = ::FindFirstFile(szMask, &wfd); bMore = handle != INVALID_HANDLE_VALUE; while(bMore) { if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if( ((strcmp(wfd.cFileName, ".") != 0) && (strcmp(wfd.cFileName, "..") != 0)) ) // filename is a directory { szFullName = pstrSourcePath + "\\" + wfd.cFileName; CountFiles(szFullName); //Funktion rekursiv aufrufen }/*if*/ }/*if*/ else { CString SourceFile = pstrSourcePath + "\\" + wfd.cFileName; m_lNumFiles++; /* MSG msg; int Return = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); if (Return!=0) { TranslateMessage(&msg); DispatchMessage(&msg); } */ }/*else*/ bMore = ::FindNextFile(handle,&wfd); }/*while*/ if (handle!=INVALID_HANDLE_VALUE) ::FindClose(handle); return m_lNumFiles; }////////////////////Ende FunktionDiese Funktion kopiert nun alle Dateien (incl. Unterverzeichnisse) vom angegebenen Quellpfad in den angegebenen Zielpfad:
BOOL SnapshotFiles(CString pstrSourcePath, CString pstrTargetPath) { BOOL bMore; WIN32_FIND_DATA wfd; HANDLE handle; CString szMask; CString szFullName; CString szTargetName; CreateDirectory(pstrTargetPath, NULL); //Zielverzeichnis erstellen szMask = pstrSourcePath + "\\*.*"; //Suchmaske für FindFirstFile handle = ::FindFirstFile(szMask, &wfd); bMore = handle != INVALID_HANDLE_VALUE; while(bMore) { if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if( ((strcmp(wfd.cFileName, ".") != 0) && (strcmp(wfd.cFileName, "..") != 0)) ) // filename is a directory { szFullName = pstrSourcePath + "\\" + wfd.cFileName; szTargetName = pstrTargetPath + "\\" + wfd.cFileName; CreateDirectory(szTargetName, NULL); //Ziel-Unterverzeichnisse erstellen m_ctlStaticDirectory.SetWindowText(szFullName); //Verzeichnis anzeigen SnapshotFiles(szFullName, szTargetName); //Funktion rekursiv aufrufen }/*if*/ }/*if*/ else { CString SourceFile = pstrSourcePath + "\\" + wfd.cFileName; CString TargetFile = pstrTargetPath + "\\" + wfd.cFileName; m_ctlStaticFile.SetWindowText(wfd.cFileName); ::CopyFile(SourceFile, TargetFile, FALSE); //Datei wird kopiert (FALSE = überschreiben, falls vorhanden) UpdateWindow(); MSG msg; int Return = PeekMessage(&msg, NULL,0,0,PM_REMOVE); if(Return!=0) { TranslateMessage(&msg); DispatchMessage(&msg); } // Prozentanteil kopierter Dateien, lNumFiles entspricht 100%. m_iZaehler++; m_iProzent = (int)(m_iZaehler*100/m_lNumFiles); //////////Verzögerungsschleife für 60000 sec ::Sleep( 60000 / m_lNumFiles ); //Falls das Kopieren zu schnell geht, manchmal sinnvoll. Ansonsten streichen. ////////////// }/*else*/ bMore = ::FindNextFile(handle,&wfd); }/*while*/ if (handle!=INVALID_HANDLE_VALUE) { ::FindClose(handle); m_ctlStaticDirectory.SetWindowText(""); m_ctlStaticFile.SetWindowText("Alle Dateien wurden kopiert."); } return TRUE; }////////////////////Ende FunktionEinfach minimal auf Borland anpassen (m_... sind Member-Variablen, die in MFC-Klassen definiert wurden).
-
Nach einigen Stunden Bastelei funzt es endlich.
Hier der Funktionsinhalt:
bool SnapshotFiles ( String startVerzeichnis, String zielVerzeichnis ){
bool bMore;
WIN32_FIND_DATA wfd;
HANDLE handle;
String szMask;
String szFullName;
String szTargetName;
int m_ctlStaticFile = 0;mkdir(zielVerzeichnis.c_str()); //Zielverzeichnis erstellen
szMask = startVerzeichnis + "\*.*"; //Suchmaske für FindFirstFile
handle = ::FindFirstFile(szMask.c_str(), &wfd);
bMore = handle != INVALID_HANDLE_VALUE;while(bMore){
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){
if( ((strcmp(wfd.cFileName, ".") != 0) && (strcmp(wfd.cFileName, "..") != 0)) ){ // filename is a directoryszFullName = startVerzeichnis + "\" + wfd.cFileName;
szTargetName = zielVerzeichnis + "\" + wfd.cFileName;
mkdir(szTargetName.c_str()); //Ziel-Unterverzeichnisse erstellenSnapshotFiles(szFullName, szTargetName); //Funktion rekursiv aufrufen
}/*if*/
}/*if*/
else{
String SourceFile = startVerzeichnis + "\" + wfd.cFileName;
String TargetFile = zielVerzeichnis + "\" + wfd.cFileName;::CopyFile(SourceFile.c_str(), TargetFile.c_str(), FALSE); //Datei wird kopiert (FALSE = überschreiben, falls vorhanden)
MSG msg;
int Return = PeekMessage(&msg, NULL,0,0,PM_REMOVE);
if(Return!=0){
TranslateMessage(&msg);
DispatchMessage(&msg);
}}/*else*/
bMore = ::FindNextFile(handle,&wfd);
}/*while*/
if (handle!=INVALID_HANDLE_VALUE){
::FindClose(handle);
return true;
}
}Im Header hab ich noch die Datei "dir.h" includet.
Die Prozentanteile hab ich rausgenommen.Aber ich hab jetzt neue Probleme:
Wie kann ich relative Pfadangaben nutzen?
Wie kann ich mit meinem Programm ein anderes Programm so starten, wie ich es in Windows mache (bzw. es ist eine .bat-Datei)
-
Hab ma in der Hilfe nachgeguckt: Wie man Dateien mit "execle" öffnen (ich versteh das mit dem Syntax nicht)?
-
Dieser Thread wurde von Moderator/in evilissimo aus dem Forum C++ in das Forum VCL/CLX (Borland C++ Builder) verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.