使用 nftw 只遍历指定的文件夹
using nftw to only traverse the folder specified
我正在使用 nftw()
进行目录遍历。现在我只想列出指定目录中的所有文件,但似乎不管所有文件夹下的是什么。好像我指定FTW_PHYS
.
nftw还是会遍历
唯一的解决方法是设置
if (ftwbuf->level > 1) {
return;
}
在被调用的函数中。但是它仍然在所有这些目录上调用此函数。
- 在任何包含指令之前启用 GNU 源代码。
#define _GNU_SOURCE
- 在调用
nftw()
之前在标志中启用 FTW_ACTIONRETVAL
。这使 nftw()
能够根据 callback_function()
. 中的 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);
}
- 在开头的
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;
}
每当 nftw()
return 目录中的文件跨越 DEPTH_LIMIT
时,FTW_SKIP_SIBLINGS
指示它跳过该目录并继续父目录中的兄弟姐妹。
如果在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;
}
我正在使用 nftw()
进行目录遍历。现在我只想列出指定目录中的所有文件,但似乎不管所有文件夹下的是什么。好像我指定FTW_PHYS
.
唯一的解决方法是设置
if (ftwbuf->level > 1) {
return;
}
在被调用的函数中。但是它仍然在所有这些目录上调用此函数。
- 在任何包含指令之前启用 GNU 源代码。
#define _GNU_SOURCE
- 在调用
nftw()
之前在标志中启用FTW_ACTIONRETVAL
。这使nftw()
能够根据callback_function()
. 中的 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);
}
- 在开头的
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;
}
每当
nftw()
return 目录中的文件跨越DEPTH_LIMIT
时,FTW_SKIP_SIBLINGS
指示它跳过该目录并继续父目录中的兄弟姐妹。如果在
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;
}