Verzeichnisstruktur kopieren



  • Hallo,

    wie kann man(möglichst schnell) eine komplette Verzeichnisstruktur besipielsweise von C:\temp\testxyz nach D:\temp kopieren?



  • Also mit CopyFile kannst einzelne Dateien kopieren(WinSDK-Fkt.)
    Um alle Dateien rauszufinden musst mir FindFirstFile und FindNextFile (Oder in der MFC geht auch CFindFile) arbeiten.
    Da ein Verzeichnis ja wieder Verzeichnisse enthalten kann, macht man das am besten rekursiv(bei der gefundenen "Datei" lässt sich prüfen, ob es ein Verzeichnis ist, auch auf "." oder ".. " (weis grade net genau, musst mal schauen^^) muss man als Sucheregbnis achten.


  • Mod

    SHFileOperation müsste das können!



  • Hmm, mein Code funktioniert irgendwie nicht:

    bool CopyDir(CString sorce, CString destination){
    	SHFILEOPSTRUCT fs;
    	fs.pFrom = sorce.GetBuffer();
    	fs.pTo = destination.GetBuffer();
    	fs.wFunc = FO_COPY;
    	fs.hwnd = NULL;
    	fs.fFlags = FOF_MULTIDESTFILES | FOF_NOCOPYSECURITYATTRIBS | FOF_NOCONFIRMATION;
    	SHFileOperation(&fs);
    	return !fs.fAnyOperationsAborted;
    }
    


  • Beziehungsweise die Art, wie ich es aufrufe:

    TCHAR buffer[MAX_PATH]; 
    buffer[0] = 0; 
    ExpandEnvironmentStrings("%AppData%", buffer, MAX_PATH + 1);
    CString APPDATA;
    APPDATA.Format("%s", buffer);
    APPDATA.Append("\\Skype");
    TCHAR b[MAX_PATH];
    DWORD dw = GetCurrentDirectory(MAX_PATH, b);
    CString cst = b;
    cst.Append("\\Skype\\*.*\"");
    cst.Insert(0, "\"");
    CopyDir(cst, APPDATA);
    

    Was macche ich falsch? 😕



  • So, mittlerweile habe ich rausgekriegt, das der Fehlercode "1026" (file not Found) zurückgegeben wird. Ich hab aber keine Ahnung, weshalb, die Dateien existieren eindeutig!



  • Warum fügst du in Zeile 11 Anführungsstriche am Anfang ein, was macht Append(...) (kennt mein CString gar nicht) und hast du schon mal den Debugger benutzt ?



  • Append hängt Zeichenketten an, die Anführungszeichen sind da, weil der Pfad Leerzeichen enthält(habe ich schonmal weggelassen, ohne Erfolg), und natürlich habe ich gedebuggt, die Pfade stimmen alle.



  • so, gelöst, Code:

    bool CopyDir(CString source, CString destination){
    	char szSrcDir[300];
    	strcpy (szSrcDir, source.Left(299));
    	char szDestDir[300];
    	strcpy (szDestDir, destination.Left(299));
    	char* szSrc  = new char[strlen(szSrcDir)  + 2]; 
    	char* szDest = new char[strlen(szDestDir) + 2]; 
    
    	// Now we have to set the mem to \0 
    	memset(szSrc,'\0',strlen(szSrcDir)+2); 
    	memset(szDest,'\0',strlen(szDestDir)+2); 
    
    	// Now copy the informations 
    	strcpy(szSrc,szSrcDir); 
    	strcpy(szDest,szDestDir); 
    
    	SHFILEOPSTRUCT CpyDir; 
    
    	printf("LocalPath: %s -> RemotePath: %s\n",szSrc,szDest); 
    
    	ZeroMemory(&CpyDir,sizeof(CpyDir)); 
    	CpyDir.wFunc    = FO_COPY; 
    	CpyDir.pFrom    = szSrc; 
    	CpyDir.pTo  = szDest; 
    	//CpyDir.fFlags   = FOF_NOCONFIRMMKDIR | FOF_SILENT | FOF_NOCONFIRMATION; 
    	int ret = SHFileOperation(&CpyDir);
    	return !CpyDir.fAnyOperationsAborted;
    }
    


  • Hallo, ich würde auch gern eine komplette Verzeichnisstruktur, samt Unterordner und darin enthaltene Dateien kopieren.
    Ich habe auch schon mit dem SHFILEOPSTRUCT rumprobiert, jedoch habe ich hier das Problem, dass falls das Verzeichnis bereits im Zielpfad existiert, er es nicht "editiert" sondern ein neues anlegt mit der vorsilbe "Kopie von ...".
    Welche Lösungsmöglichkeiten bestehen hierfür bzw. welche Libs/Klassen stellt MFC/Visual Studio zur Verfügung?
    Wäre über jede Hilfe sehr Dankbar!

    Grüße,
    inva


Anmelden zum Antworten