如果通过显式方法递归遍历目录树,当符号链接指向父目录时,您将遇到无限递归问题.
一个明显的解决方案是只检查符号链接而不是完全遵循它们.但对于那些不希望出于其他目的行为的用户而言,这可能是一个令人不快的意外,例如一个完全正常的目录被默默地忽略.
另一种解决方案可能是保留到目前为止访问的所有目录的哈希表,并使用它来检查循环.但是这需要有一些规范的表示形式,以某种方式来获取您当前正在查看的目录的身份(无论您到达它的路径如何).
如果是这样,有没有办法获得这样的规范表示/目录的身份,可以在Unix系统上移植? (我希望它适用于Linux,BSD,Mac OS,Solaris等.我希望必须为Windows编写单独的代码.)
此字段中最常被忽略的API将是
Nftw可以选择避免它遍历符号链接.它具有比这更先进的功能.以下是手册页本身的简单示例:
#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); }
也可以看看
> Directory recursion
> http://rosettacode.org/wiki/Walk_a_directory/Recursively