vacío una ruta otra mover guardar está especifica eliminar directorio carpeta archivos archivo c++ c windows winapi win32-process

c++ - otra - guardar un archivo en una ruta especifica c#



¿Por qué la función RemoveDirectory no elimina la mayor parte de la carpeta? (3)

refiérase a: codeguru.com/forum/showthread.php?t=239271

Al usar la función siguiente para eliminar carpetas, todas las carpetas, subcarpetas y archivos se eliminan, excepto la carpeta que se encuentra en la parte superior. Digamos por la ruta c:/folder1/folder2 todo lo que se encuentra debajo de la folder2 se elimina a excepción de la folder2 .

BOOL DeleteDirectory(const TCHAR* sPath) { HANDLE hFind; // file handle WIN32_FIND_DATA FindFileData; TCHAR DirPath[MAX_PATH]; TCHAR FileName[MAX_PATH]; _tcscpy(DirPath,sPath); _tcscat(DirPath,_T("//")); _tcscpy(FileName,sPath); _tcscat(FileName,_T("//*")); // searching all files int nRet = 0; hFind = FindFirstFile(FileName, &FindFileData); // find the first file if( hFind != INVALID_HANDLE_VALUE ) { do { if( IsDots(FindFileData.cFileName) ) continue; //if not directory continue _tcscpy(FileName + _tcslen(DirPath), FindFileData.cFileName); if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { // we have found a directory, recurse if( !DeleteDirectory(FileName) ) break; // directory couldn''t be deleted } else { if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) _wchmod(FileName, _S_IWRITE); // change read-only file mode if( !DeleteFile(FileName) ) break; // file couldn''t be deleted } }while( FindNextFile(hFind, &FindFileData) ); nRet = FindClose(hFind); // closing file handle } return RemoveDirectory(sPath); // remove the empty (maybe not) directory and returns zero when RemoveDirectory function fails }

Cualquier ayuda para encontrar el problema es apreciada. Durante la depuración noté que la función FindClose cerraba con éxito el manejador del archivo pero GetLastError devolvía 32 ("El proceso no puede acceder al archivo porque lo está usando otro proceso"). Sin embargo, no tengo ni idea después de probar con el explorador de procesos.


Si bien puede eliminar un directorio de esta manera, es más sencillo dejar que el sistema lo haga por usted llamando a SHFileOperation pasando FO_DELETE . Recuerde que debe duplicar la terminación nula de la cadena que pasa a esta API.


Creo que debes cerrar el identificador del archivo antes de la llamada recursiva. Lo que significa que después de salir de la llamada recursiva, debe volver a configurar su identificador de archivo a algo apropiado.

SHFileOperation puede ser una mejor solución; Solo estoy respondiendo la pregunta del OP de por qué su código no funcionaba como estaba previsto.


Consulte: http: //www.codeguru.com/forum/archive/index.php/t-337897.html
A continuación se muestra el código para eliminar el directorio utilizando SHFileOperation

bool DeleteDirectory(LPCTSTR lpszDir, bool noRecycleBin = true) { int len = _tcslen(lpszDir); TCHAR* pszFrom = new TCHAR[len+4]; //4 to handle wide char //_tcscpy(pszFrom, lpszDir); //todo:remove warning//;//convet wchar to char* wcscpy_s (pszFrom, len+2, lpszDir); pszFrom[len] = 0; pszFrom[len+1] = 0; SHFILEOPSTRUCT fileop; fileop.hwnd = NULL; // no status display fileop.wFunc = FO_DELETE; // delete operation fileop.pFrom = pszFrom; // source file name as double null terminated string fileop.pTo = NULL; // no destination needed fileop.fFlags = FOF_NOCONFIRMATION|FOF_SILENT; // do not prompt the user if(!noRecycleBin) fileop.fFlags |= FOF_ALLOWUNDO; fileop.fAnyOperationsAborted = FALSE; fileop.lpszProgressTitle = NULL; fileop.hNameMappings = NULL; int ret = SHFileOperation(&fileop); //SHFileOperation returns zero if successful; otherwise nonzero delete [] pszFrom; return (0 == ret); }