如何在C++中删除非空目录?

Fra*_*ank 4 c++ file-io file

在C++中,如何删除包含所有包含文件的目录?我知道有rmdir,但它只会删除非空目录,所以我如何首先列出并删除所有包含的文件?

我知道使用Boost Filesystem应该不会很难,但我有点想避免构建并依赖它来完成这个小任务......

Jer*_*fin 8

是的,您通常必须先删除内容.如果您不想为此使用Boost,那么您几乎不得不编写非可移植代码以递归方式查找所有文件(例如FindFirstFile,FindNextFile在Windows上opendir,readdir在Unix上和类似文件中),并删除所有这些文件.

在Windows上,您还可以使用ShFileOperation或使用IFileOperation接口.这些可以在内部处理递归删除,因此您只需为其指定要删除的目录的名称,然后处理其余的目录.

与大多数COM的东西,在IFileOperation界面似乎是专门为了尽可能地(例如,作为笨拙IFileOperation::DeleteItem实际上并没有删除任何东西-它只是增加了一个项目的事情的清单被删除然后,你要打电话IFileOperation::PerformOperations到做实际的删除.


bta*_*bta 5

您可以使用以下代码删除非空目录.这使用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)