我开发了一个函数,用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");
}这将删除目录及其内容。但我只想删除内容,而不删除顶层目录本身。
是否有一种方法可以添加一些检查来跳过顶部dir的删除?
发布于 2022-01-13 13:23:55
首先,在这种情况下,测试typeflag != FTW_D是无用的,因为FTW_DEPTH标志nftw指示它以后续顺序遍历目录,然后nftw从不传递被调用的例程--标志FTW_D,该标记指示以预先顺序遍历的目录。对于按后顺序遍历的目录,它将传递FTW_DP。
您可以将测试更改为typeflag != FTW_DP,然后程序将永远不会删除任何目录,因此不会删除树的顶部目录。
但是,要让程序删除除顶部以外的所有文件和子目录,可以在传递的struct FTW中使用级别指示符。level成员指示当前对象的深度,顶部目录为零,其中一个为其中的对象,两个为其中的对象,依此类推。因此,测试可以简单地:
if (0 < ftwbuf->level)
return remove(fpath);请注意,您的程序应该使用#include <stdio.h>声明remove。
https://stackoverflow.com/questions/70695049
复制相似问题