C 长文件路径的stat替代方案

C 长文件路径的stat替代方案,c,linux,C,Linux,我正在编写一个程序,通过递归构造树中每个文件的路径,并存储遇到的文件的相对路径,在目录树深度优先(depth first)中迭代,类似于GNU find程序。它还收集了一些关于这些文件的统计数据。为此,我使用stat函数 我注意到,根据stat的文档,对于非常深的目录层次结构,即长文件路径,这是失败的 现在我的问题是:在这里我可以使用什么样的替代方法来保证对任何长度的路径都有效?我不需要工作代码,只要一个粗略的大纲就足够了。在遍历时,打开遍历的每个目录 然后,您可以使用获取有关该目录中文件的信息

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

我注意到,根据stat的文档,对于非常深的目录层次结构,即长文件路径,这是失败的


现在我的问题是:在这里我可以使用什么样的替代方法来保证对任何长度的路径都有效?我不需要工作代码,只要一个粗略的大纲就足够了。

在遍历时,打开遍历的每个目录

然后,您可以使用获取有关该目录中文件的信息。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。_FDCWD处的特殊值可以作为dirfd传递,以引用当前工作目录

int fstatat(int dirfd, const char *pathname, struct stat *buf,
            int flags);
警告 很容易进入符号链接循环并永远递归。在实践中发现符号链接循环并不少见。在我的系统上,/usr/bin/X11是指向/usr/bin的符号链接

选择
有更简单的方法可以遍历文件层次结构。如果可以,请使用or。

为什么失败?有任何错误消息或代码吗?举个例子会很有帮助。处理目录时,请更改其中的当前工作目录。完成后,换回去。使用与CWD相关的名称。这使得发送到stat的文件路径非常短。打印长路径时重建它们。寻求调试帮助的问题此代码为什么不起作用?必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。你有没有读过这个问题?我知道为什么我的代码不起作用,我一直在寻找解决问题的替代方法,而不是调试帮助。当MCVE显然无法改善问题时,这些立即的叫喊声让我恼火不已。哇,太快了。我想我目前的方法有点粗糙,我会尝试这些建议,看看哪一个最适合。