使用 nftw 只遍历指定的文件夹

using nftw to only traverse the folder specified

我正在使用 nftw() 进行目录遍历。现在我只想列出指定目录中的所有文件,但似乎不管所有文件夹下的是什么。好像我指定FTW_PHYS.

nftw还是会遍历

唯一的解决方法是设置

if (ftwbuf->level > 1) {
    return;
}

在被调用的函数中。但是它仍然在所有这些目录上调用此函数。

  1. 在任何包含指令之前启用 GNU 源代码。
#define _GNU_SOURCE
  1. 在调用 nftw() 之前在标志中启用 FTW_ACTIONRETVAL。这使 nftw() 能够根据 callback_function().
  2. 中的 return 值追索其执行
/* snippet from nftw manpage */
#define MAX_OPEN_FDS    64
    flags |= FTW_ACTIONRETVAL; // enables callback_function() to recourse 
    if (nftw ((argc < 2) ? "." : argv[1], callback_function, MAX_OPEN_FDS, flags)
            == -1) {
        perror ("nftw");
        exit (EXIT_FAILURE);
    }
  1. 在开头的 callback_function() 中,如果目录超出所需级别,则跳过该目录。
#define DEPTH_LIMIT 1
/*
...
*/
int
callback_function (const char *fpath, const struct stat *sb,
              int tflag, struct FTW *ftwbuf) {
// works even when FTW_DEPTH is enabled.
// at the top first condition to check; 
if (ftwbuf->level > DEPTH_LIMIT) return FTW_SKIP_SIBLINGS;
/*
...
*/
    return FTW_CONTINUE;
}
  1. 每当 nftw() return 目录中的文件跨越 DEPTH_LIMIT 时,FTW_SKIP_SIBLINGS 指示它跳过该目录并继续父目录中的兄弟姐妹。

  2. 如果在nftw()flags中省略FTW_DEPTH,则可以使用FTW_SKIP_SUBTREE特征;其中 nftw() 立即跳过一个目录。

    • FTW_DEPTH 指示 nftw() 遍历其中的所有文件和 sub-directories 之后传递目录本身。这种 post-order 目录遍历使得使用 FTW_SKIP_SUBTREE;
    • 变得困难
// without `FTW_DEPTH` in nftw-flags 
int
callback_function (const char *fpath, const struct stat *sb,
              int tflag, struct FTW *ftwbuf) {
/*
...
*/
    if (DEPTH_LIMIT == ftwbuf->level && FTW_D == tflag) // a directory
        return FTW_SKIP_SUBTREE; // don't get into the directory
    else
        return FTW_CONTINUE;
}