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 Funktion
    

    Diese 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 Funktion
    

    Einfach 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 directory

    szFullName = startVerzeichnis + "\" + wfd.cFileName;
    szTargetName = zielVerzeichnis + "\" + wfd.cFileName;
    mkdir(szTargetName.c_str()); //Ziel-Unterverzeichnisse erstellen

    SnapshotFiles(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.


Anmelden zum Antworten