我试图使用C的nftw()函数递归地迭代一个文件夹,以打印完整的目录结构,同时我找不到检查级别是否已更改的方法,即,它已在目录中移动或仅在目录中迭代。那么,有什么方法可以使用nftw()检查级别的变化吗?

最佳答案

如果您阅读了nftw()的POSIX规范,您将发现:
在遇到的每个文件中,nftw()应使用四个参数调用用户提供的函数:
第一个参数是对象的路径名。
第二个参数是指向包含对象信息的stat缓冲区的指针…
第三个参数是提供附加信息的整数。其值为以下值之一:
fn-对象是一个目录。

第四个参数是指向FTW_D结构的指针。FTW的值是作为第一个参数传递给base的路径名中对象文件名的偏移量。fn的值表示相对于漫游根的深度,其中根级别为0。
所以,问题的答案是FTW对象的level元素告诉您当前项的级别。如果您需要发现更改,您将需要以某种方式跟踪上一个级别-它可能是一个文件范围变量。
如果有一个level(调用它nftw())的变体,它为用户提供的“额外信息”参数做了准备,这将是一个nftw2()参数,该参数将传递给void *,而nftw2()参数将转发给被调用的函数,那就太好了。那么就不需要file scope变量了。
至少,BSD、macOS和Linux系统可以替代nftw2()-nftw()函数(也可以是FreeBSD)。macOS手册说,它们可能是POSIX未来版本的一部分,但它们不是POSIX2017的一部分。(我在这里也看不到额外的信息参数-哦,好吧!如果要设计回调系统,请考虑提供可使用的上下文(或“额外信息”)参数。)

09-30 14:39