首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nftw:删除目录内容而不删除顶部dir本身。

nftw:删除目录内容而不删除顶部dir本身。
EN

Stack Overflow用户
提问于 2022-01-13 10:28:47
回答 1查看 145关注 0票数 0

我开发了一个函数,用nftw()递归地删除一个目录。

代码语言:javascript
复制
#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的删除?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-13 13:23:55

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

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

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

代码语言:javascript
复制
if (0 < ftwbuf->level)
    return remove(fpath);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70695049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档