gpt4 book ai didi

unix - 目录递归和符号链接(symbolic link)

转载 作者:行者123 更新时间:2023-12-02 07:33:33 24 4
gpt4 key购买 nike

如果您通过明显的方法递归地遍历目录树,那么当符号链接(symbolic link)指向父目录时,您将遇到无限递归的麻烦。

一个明显的解决方案是仅检查符号链接(symbolic link),而根本不遵循它们。但这对于不希望出于其他目的(例如完全正常的目录)而被默默忽略的用户来说可能是一个令人不快的意外。

另一种解决方案可能是保留迄今为止访问过的所有目录的哈希表,并使用它来检查循环。但这需要有一些规范的表示,以及某种获取您当前正在查看的目录的身份的方法(无论您通过什么路径到达它)。

Unix 用户通常会认为第二种解决方案不那么令人惊讶吗?

如果是这样,有没有办法获得目录的规范表示/身份,并且可以跨 Unix 系统移植? (我希望它能够跨 Linux、BSD、Mac OS、Solaris 等运行。我希望必须为 Windows 编写单独的代码。)

最佳答案

该领域最常被忽略的 API 是

nftw

Nftw 有选项来避免遍历符号链接(symbolic link)。它具有比这更先进的功能。这是手册页本身的一个简单示例:

#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

static int
display_info(const char *fpath, const struct stat *sb,
int tflag, struct FTW *ftwbuf)
{
printf("%-3s %2d %7jd %-40s %d %s\n",
(tflag == FTW_D) ? "d" : (tflag == FTW_DNR) ? "dnr" :
(tflag == FTW_DP) ? "dp" : (tflag == FTW_F) ? "f" :
(tflag == FTW_NS) ? "ns" : (tflag == FTW_SL) ? "sl" :
(tflag == FTW_SLN) ? "sln" : "???",
ftwbuf->level, (intmax_t) sb->st_size,
fpath, ftwbuf->base, fpath + ftwbuf->base);
return 0; /* To tell nftw() to continue */
}

int
main(int argc, char *argv[])
{
int flags = 0;

if (argc > 2 && strchr(argv[2], 'd') != NULL)
flags |= FTW_DEPTH;
if (argc > 2 && strchr(argv[2], 'p') != NULL)
flags |= FTW_PHYS;

if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags)
== -1)
{
perror("nftw");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}

另请参阅

关于unix - 目录递归和符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7377733/

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