在C++中,如何删除包含所有包含文件的目录?我知道有rmdir,但它只会删除非空目录,所以我如何首先列出并删除所有包含的文件?
我知道使用Boost Filesystem应该不会很难,但我有点想避免构建并依赖它来完成这个小任务......
是的,您通常必须先删除内容.如果您不想为此使用Boost,那么您几乎不得不编写非可移植代码以递归方式查找所有文件(例如FindFirstFile,FindNextFile在Windows上opendir,readdir在Unix上和类似文件中),并删除所有这些文件.
在Windows上,您还可以使用ShFileOperation或使用IFileOperation接口.这些可以在内部处理递归删除,因此您只需为其指定要删除的目录的名称,然后处理其余的目录.
与大多数COM的东西,在IFileOperation界面似乎是专门为了尽可能地(例如,作为笨拙IFileOperation::DeleteItem实际上并没有删除任何东西-它只是增加了一个项目的事情的清单被删除然后,你要打电话IFileOperation::PerformOperations到做实际的删除.
您可以使用以下代码删除非空目录.这使用Unix风格的命令,但可以使用Cygwin为Windows编译(如果您不介意依赖于Cygwin DLL).
void delete_folder_tree (const char* directory_name) {
DIR* dp;
struct dirent* ep;
char p_buf[512] = {0};
dp = opendir(directory_name);
while ((ep = readdir(dp)) != NULL) {
sprintf(p_buf, "%s/%s", directory_name, ep->d_name);
if (path_is_directory(p_buf))
delete_folder_tree(p_buf);
else
unlink(p_buf);
}
closedir(dp);
rmdir(directory_name);
}
int path_is_directory (const char* path) {
struct stat s_buf;
if (stat(path, &s_buf))
return 0;
return S_ISDIR(s_buf.st_mode);
}
Run Code Online (Sandbox Code Playgroud)