在 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
如果使用目录条目(typeflag
是FTW_D
)调用fn()
,则此 返回值将阻止该目录中的对象作为fn()
的参数。nftw()
继续处理 目录。
FTW_STOP
导致nftw()
立即返回并返回值 FTW_STOP。其他返回值可能与未来的新操作相关联;
fn()
应该 不返回上述以外的值。必须定义功能测试宏
_GNU_SOURCE
才能获得定义 来自<ftw.h>
的FTW_ACTIONRETVAL
。
最后一段是你要注意的关键。
【讨论】:
以上是关于在 c 中使用 ntfw 时跳过子目录的主要内容,如果未能解决你的问题,请参考以下文章
C#/ADO.NET - 在数据表中使用 SetField 时跳过的行?