gpt4 book ai didi

c - 长文件路径的 stat 替代方案

转载 作者:行者123 更新时间:2023-11-30 18:34:20 24 4
gpt4 key购买 nike

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

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

现在我的问题是:我可以在这里使用什么替代方法来保证适用于任何长度的路径? (我不需要工作代码,只需一个粗略的轮廓就足够了)。

最佳答案

当您遍历时,打开您遍历的每个目录。

然后您可以使用 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传递来引用当前工作目录。

注意事项

很容易进入符号链接(symbolic link)循环并永远递归。在实践中发现符号链接(symbolic link)循环并不罕见。在我的系统上,/usr/bin/X11/usr/bin 的符号链接(symbolic link)。

替代方案

有更简单的方法来遍历文件层次结构。使用ftwfts相反,如果可以的话。

关于c - 长文件路径的 stat 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52448530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com