我试图使用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的一部分。(我在这里也看不到额外的信息参数-哦,好吧!如果要设计回调系统,请考虑提供可使用的上下文(或“额外信息”)参数。)