长文件路径的stat替代

时间:2018-09-21 17:29:36

标签: c linux

我正在编写一个程序,该程序通过递归构造树中每个文件的路径并存储遇到的文件的相对路径来首先遍历目录树的深度(类似于GNU find程序)。它还收集有关这些文件的一些统计信息。为此,我使用了stat函数。

根据stat的文档,我注意到对于非常深的目录层次结构(即长文件路径),此操作将失败。

现在我的问题是:我可以在这里使用哪种替代方法保证对任何长度的路径都起作用? (我不需要有效的代码,只需一个大概的轮廓就足够了。)

1 个答案:

答案 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的符号链接。

替代品

有更简单的遍历文件层次结构的方法。如果可以,请改用ftwfts