3

我正在尝试使用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;
4

1 回答 1

4

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

nftw()

该函数nftw()与 相同ftw(),只是它有一个额外的参数flags,并且调用fn()时还有一个参数 ,ftwbuf

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

  • FTW_ACTIONRETVAL(自 glibc 2.3.3 起)
    如果设置了这个 glibc-specific flag,则以不同nftw()的方式处理返回值fn()fn()应返回以下值之一:

    • FTW_CONTINUE 指示nftw()正常继续。

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

    • FTW_SKIP_SUBTREE
      如果 使用目录条目 ( is )fn()调用,则此返回值将阻止该目录中的对象作为参数传递给 . 继续处理目录的下一个兄弟。typeflagFTW_Dfn()nftw()

    • FTW_STOP
      使用返回值 FTW_STOP导致nftw()立即返回。

    • 其他返回值可能与将来的新操作相关联; fn() 不应返回上面列出的值以外的值。

    _GNU_SOURCE必须定义功能测试宏才能获得FTW_ACTIONRETVALfrom的定义<ftw.h>

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

于 2015-08-05T20:32:33.610 回答