Pourquoi la fonction RemoveDirectory ne supprime-t-elle pas le dossier le plus haut?

référez-vous à: codeguru.com/forum/showthread.php?t=239271

Lorsque vous utilisez la fonction ci-dessous pour supprimer des dossiers, tous les dossiers, sous-dossiers et fichiers sont supprimés, à l’exception du dossier le plus haut. Dites pour le chemin c:\folder1\folder2 tout ce qui est sous folder2 est supprimé sauf pour 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.dwFileAtsortingbutes & FILE_ATTRIBUTE_DIRECTORY)) { // we have found a directory, recurse if( !DeleteDirectory(FileName) ) break; // directory couldn't be deleted } else { if(FindFileData.dwFileAtsortingbutes & 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 } 

Toute aide pour trouver le problème est appréciée. Pendant le débogage, j’ai remarqué que la fonction FindClose le FindClose fichier, mais GetLastError 32 (“Le processus ne peut pas accéder au fichier car il est utilisé par un autre processus”).

Alors que vous pouvez supprimer un répertoire de cette façon, il est plus simple de laisser le système le faire pour vous en appelant SHFileOperation passant FO_DELETE . Rappelez-vous que vous devez doubler null la chaîne que vous transmettez à cette API.

Je pense que vous devez fermer le descripteur de fichier avant l’appel récursif. Ce qui signifie qu’après avoir quitté l’appel récursif, vous devez à nouveau définir votre descripteur de fichier sur quelque chose de approprié.

SHFileOperation peut être une meilleure solution. Je ne fais que répondre à la question du PO sur la raison pour laquelle leur code ne fonctionnait pas comme prévu.

Référer: http: //www.codeguru.com/forum/archive/index.php/t-337897.html
Étant donné ci-dessous le code pour supprimer le répertoire en utilisant 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 ssortingng 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); }