在 c 中使用 ntfw 时跳过子目录

Posted

技术标签:

【中文标题】在 c 中使用 ntfw 时跳过子目录【英文标题】:Skip subdirectories when using ntfw in c 【发布时间】:2015-08-05 19:09:01 【问题描述】:

我正在尝试使用nftw 获取当前或提到的文件夹中的所有文件和目录。但是我如何指示函数不要在任何子目录中走得更远?标记FTW_SKIP_SUBTREE 的目的是什么?还有这个常量的头文件是什么。

#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

static int
display_info(const char *fpath, const struct stat *sb,
             int tflag, struct FTW *ftwbuf)


    printf("%-3s %2d %7jd   %-40s %d %s\n",
        (tflag == FTW_D) ?   "d"   : (tflag == FTW_DNR) ? "dnr" :
        (tflag == FTW_DP) ?  "dp"  : (tflag == FTW_F) ?   "f" :
        (tflag == FTW_NS) ?  "ns"  : (tflag == FTW_SL) ?  "sl" :
        (tflag == FTW_SLN) ? "sln" : "???",
        ftwbuf->level, (intmax_t) sb->st_size,
        fpath, ftwbuf->base, fpath + ftwbuf->base);
    return 0;           /* To tell nftw() to continue */


int
main(int argc, char *argv[])

    int flags = 0;

    if (argc > 2 && strchr(argv[2], 'd') != NULL)
      flags |= FTW_DEPTH;
    if (argc > 2 && strchr(argv[2], 'p') != NULL)
      flags |= FTW_PHYS;
    if (argc > 2 && strchr(argv[2], 's') != NULL)
      flags |= FTW_SKIP_SUBTREE;

    if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags)
            == -1) 
        perror("nftw");
        exit(EXIT_FAILURE);
    
    exit(EXIT_SUCCESS);

当我尝试编译时,我收到了这条消息

test.c:33:16: error: ‘FTW_SKIP_SUBTREE’ undeclared (first use in this function)
       flags |= FTW_SKIP_SUBTREE;

【问题讨论】:

【参考方案1】:

Linux 上nftw() 的手册页说(部分):

nftw()

函数nftw()ftw()相同,只是多了一个参数flags, 并调用 fn() 并添加一个参数 ftwbuf

此标志参数由以下标志中的零个或多个 ORing 形成:

FTW_ACTIONRETVAL(自 glibc 2.3.3 起) 如果设置了这个 glibc 特定的flag,那么nftw() 处理来自fn() 的返回值 不同。 fn() 应该返回以下值之一:

FTW_CONTINUE 指示nftw() 正常继续。

FTW_SKIP_SIBLINGS 如果fn() 返回此值,则当前条目的兄弟姐妹将是 跳过,并在父级中继续处理。

FTW_SKIP_SUBTREE 如果使用目录条目(typeflagFTW_D)调用 fn(),则此 返回值将阻止该目录中的对象作为 fn() 的参数。 nftw() 继续处理 目录。

FTW_STOP 导致nftw() 立即返回并返回值 FTW_STOP。

其他返回值可能与未来的新操作相关联; fn()应该 不返回上述以外的值。

必须定义功能测试宏_GNU_SOURCE才能获得定义 来自&lt;ftw.h&gt;FTW_ACTIONRETVAL

最后一段是你要注意的关键。

【讨论】:

以上是关于在 c 中使用 ntfw 时跳过子目录的主要内容,如果未能解决你的问题,请参考以下文章

Ansible - 当至少一个项目在循环中失败时跳过任务

C#/ADO.NET - 在数据表中使用 SetField 时跳过的行?

如何在使用 scandir() 时跳过我无权读取/访问的文件,以避免所有记录的错误?

c ++程序在输入时跳过行[控制台应用程序]

在 R 中满足条件时跳过一行代码

使用 mono 交叉编译 c 时跳过不兼容的库 (lmono)