我正在编写一个程序,该程序通过递归构造树中每个文件的路径并存储遇到的文件的相对路径来首先遍历目录树的深度(类似于GNU find程序)。它还收集有关这些文件的一些统计信息。为此,我使用了stat
函数。
根据stat
的文档,我注意到对于非常深的目录层次结构(即长文件路径),此操作将失败。
现在我的问题是:我可以在这里使用哪种替代方法保证对任何长度的路径都起作用? (我不需要有效的代码,只需一个大概的轮廓就足够了。)
答案 0 :(得分:3)
遍历时,打开遍历的每个目录。
然后您可以使用fstatat
获取有关该目录中文件的信息。 fstatat
函数使用一个附加参数dirfd
。如果将句柄传递给该参数中的打开目录,则该路径将被解释为相对于该目录的路径。
int fstatat(int dirfd, const char *pathname, struct stat *buf,
int flags);
基本用法是:
int dirfd = open("directory path", O_RDONLY);
struct stat st;
int r = fstatat(dirfd, "relative file path", &st, 0);
当然,您也可以在递归时使用openat
而不是open
。特殊值AT_FDCWD
可以作为dirfd
传递来引用当前工作目录。
很容易进入symlink循环并永远递归。在实践中找到符号链接循环并不少见。在我的系统上,/usr/bin/X11
是到/usr/bin
的符号链接。