为什么RemoveDirectory函数不能删除最顶层的文件夹?

请参阅:codeguru.com/forum/showthread.php?t=239271

使用下面的function删除文件夹时,除最上面的文件夹外,所有文件夹,子文件夹和文件都将被删除。 说pathc:\folder1\folder2所有东西都被删除,除了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 } 

任何帮助find问题表示赞赏。 在debugging过程中,我注意到FindClose函数正在成功closures文件句柄,但GetLastError返回32(“进程无法访问该文件,因为它正在被另一个进程使用”)。但是,我不知道使用进程pipe理器。

Solutions Collecting From Web of "为什么RemoveDirectory函数不能删除最顶层的文件夹?"

虽然可以用这种方式删除目录,但让系统通过调用SHFileOperation传递FO_DELETE来更简单。 请记住,您必须对您传递给此API的字符串进行双空终止。

我相信你必须在递归调用之前关闭文件句柄。 这意味着在退出递归调用之后,您必须再次将您的文件句柄设置为适当的值。

SHFileOperation可能是更好的解决方案; 我只是回答OP为什么他们的代码不能按预期工作的问题。

请参考:HTTP://www.codeguru.com/forum/archive/index.php/t-337897.html
下面给出的是使用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); }