nftw:删除目录内容而不删除顶级目录本身

nftw: remove the directory content without removing the top dir itself

我开发了一个函数来递归删除目录 nftw():

#include <errno.h>
#include <string.h>
#include <ftw.h>     /* for nftw() */

int unlink_cb(
    const char *fpath, const struct stat *sb, int typeflag, struct FTW *ftwbuf)
{
    if(typeflag != FTW_D) {
        return remove(fpath);
    }
    return 0;
}

int rm_rf(const char *path)
{
    return nftw(path,
                unlink_cb,
                64 /* number of simultaneously opened fds, up to OPEN_MAX */,
                FTW_DEPTH | FTW_PHYS);
}


int main(int argc, const char *argv[])
{
    rm_rf("any");
}

这将删除目录及其内容。但我只想删除内容而不删除顶级目录本身。

有没有办法添加一些检查以跳过顶级目录的删除?

首先,测试 typeflag != FTW_D 在这种情况下是无用的,因为 nftwFTW_DEPTH 标志指示它以 post 顺序遍历目录,然后 nftw 永远不会将标志 FTW_D 传递给被调用的例程,该标志指示按预先顺序遍历的目录。对于以 post 顺序遍历的目录,它传递 FTW_DP.

您可以将测试更改为 typeflag != FTW_DP,然后程序将永远不会删除任何目录,因此它不会删除树的顶级目录。

但是,要让程序删除除顶级目录之外的所有文件和子目录,您可以使用传递的 struct FTW 中的级别指示器。 level 成员表示当前对象的深度,顶级目录为零,其中的对象为一,其中的对象为二,依此类推。所以测试可以很简单:

if (0 < ftwbuf->level)
    return remove(fpath);

请注意,您的程序应使用 #include <stdio.h> 来声明 remove