如何recursion删除目录?

RemoveDirectory(); 只删除空目录,但如何删除里面有文件的目录?

如果您准备使用Windows API,那么最简单的方法就是调用SHFileOperation 。 使用FO_DELETE操作,不要忘记将空白终止您的目录名称。

最好的解决方案,如果你可以使用它,是boost::filesystem::remove_all 。 这样,你就不必担心平台特定的东西。 我不知道有任何其他平台独立的解决方案; 否则通常的方式将涉及读目录,并递归降序(但读取目录的方式也使用boost::filesystem或系统相关的代码)。

通常,如果没有库方法可用,则通过递归完成。 一个函数遍历所有的目录条目,删除“普通”文件,并用找到的任何目录路径调用它自己。 这破坏了整个目录树,(我的Windows版本对传递的路径有明确的检查,以防止在意外传入自杀参数的情况下破坏OS文件夹)。

根据MSDN,与相对路径一起使用时,SHFileOperation不是线程安全的。 它只能安全​​地使用绝对路径。

我建议使用这个代码:

 double directory_delete(char *pathname) { string str(pathname); if (!str.empty()) { while (*str.rbegin() == '\\' || *str.rbegin() == '/') { str.erase(str.size()-1); } } replace(str.begin(),str.end(),'/','\\'); struct stat sb; if (stat((char *)str.c_str(),&sb) == 0 && S_ISDIR(sb.st_mode)) { HANDLE hFind; WIN32_FIND_DATA FindFileData; TCHAR DirPath[MAX_PATH]; TCHAR FileName[MAX_PATH]; _tcscpy(DirPath,(char *)str.c_str()); _tcscat(DirPath,"\\*"); _tcscpy(FileName,(char *)str.c_str()); _tcscat(FileName,"\\"); hFind = FindFirstFile(DirPath,&FindFileData); if (hFind == INVALID_HANDLE_VALUE) return 0; _tcscpy(DirPath,FileName); bool bSearch = true; while (bSearch) { if (FindNextFile(hFind,&FindFileData)) { if (!(_tcscmp(FindFileData.cFileName,".") && _tcscmp(FindFileData.cFileName,".."))) continue; _tcscat(FileName,FindFileData.cFileName); if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { if (!directory_delete(FileName)) { FindClose(hFind); return 0; } RemoveDirectory(FileName); _tcscpy(FileName,DirPath); } else { if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) _chmod(FileName, _S_IWRITE); if (!DeleteFile(FileName)) { FindClose(hFind); return 0; } _tcscpy(FileName,DirPath); } } else { if (GetLastError() == ERROR_NO_MORE_FILES) bSearch = false; else { FindClose(hFind); return 0; } } } FindClose(hFind); return (double)(RemoveDirectory((char *)str.c_str()) == true); } else { return 0; } } 

如果你想“按原样”使用我的代码,你需要在你的cpp文件的顶部使用这些头文件:

 #include <windows.h> // winapi #include <sys/stat.h> // stat #include <tchar.h> // _tcscpy,_tcscat,_tcscmp #include <string> // string #include <algorithm> // replace using namespace std; 

…我想就是这样。

我的代码是基于这篇文章:

http://www.codeguru.com/cpp/wp/files/folderdirectorymaintenance/article.php/c8999/Deleting-a-Directory-Along-with-SubFolders.htm

我强烈建议不要使用SHFileOperation,除了安全问题之外,自Windows Vista以来,它被替换为IFileOperation。

希望这可以帮助!

这可能是跛脚,但考虑使用

 system("rd /s /q ..."); 

这是丑陋的,但它太简单了,不能忽视。 它也包含了所有“如何处理网络共享文件”的东西。 无论你提出的解决方案可能是一个(不完整的和/或不正确的) rd重新实现,所以调用外部进程实际上是很好的代码重用。 😉