我正在尝试使用 C 的 nftw() 函数递归迭代文件夹以打印完整的目录结构,但我找不到检查级别是否已更改的方法,即它已移动到目录中还是仅在目录中迭代。那么,有什么方法可以使用 nftw() 检查级别的变化吗?
1 回答
如果您阅读 POSIX 规范nftw()
,您会发现:
在它遇到的每个文件中,应使用四个参数
nftw()
调用用户提供的函数:fn
第一个参数是对象的路径名。
第二个参数是指向包含对象信息的 stat 缓冲区的指针……</p>
第三个参数是一个提供附加信息的整数。其值为以下之一:
FTW_D
— 对象是一个目录。- …</li>
第四个参数是指向
FTW
结构的指针。的值base
是作为第一个参数传递给的路径名中对象文件名的偏移量fn
。的值level
表示相对于步行根的深度,其中根级别为 0。
所以,你的问题的答案是level
FTW 对象的元素告诉你当前项目的级别。如果您需要发现更改,则需要以某种方式跟踪上一个级别——它可能是一个文件范围变量。
nftw()
如果(call it nftw2()
) 有一个变体来提供用户提供的“额外信息”参数,那就太好了——avoid *
将被传递给nftw2()
并nftw2()
中继到被调用的函数。那么你就不需要文件范围变量了。
至少,BSD、macOS 和 Linux 系统具有替代nftw()
功能fts(3)
(也在FreeBSD中)。macOS 手册说它们可能是 POSIX 未来版本的一部分,但它们不是 POSIX 2017 的一部分。(我在这里也没有看到额外的信息参数——哦,好吧!如果你正在设计回调系统,请考虑提供可以使用的上下文(或“额外信息”)参数。)