加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

unix – 目录递归和符号链接

发布时间:2020-12-16 01:09:51 所属栏目:安全 来源:网络整理
导读:如果通过显式方法递归遍历目录树,当符号链接指向父目录时,您将遇到无限递归问题. 一个明显的解决方案是只检查符号链接而不是完全遵循它们.但对于那些不希望出于其他目的行为的用户而言,这可能是一个令人不快的意外,例如一个完全正常的目录被默默地忽略. 另一
如果通过显式方法递归遍历目录树,当符号链接指向父目录时,您将遇到无限递归问题.

一个明显的解决方案是只检查符号链接而不是完全遵循它们.但对于那些不希望出于其他目的行为的用户而言,这可能是一个令人不快的意外,例如一个完全正常的目录被默默地忽略.

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

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

如果是这样,有没有办法获得这样的规范表示/目录的身份,可以在Unix系统上移植? (我希望它适用于Linux,BSD,Mac OS,Solaris等.我希望必须为Windows编写单独的代码.)

此字段中最常被忽略的API将是

nftw

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 %sn",(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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读