• FTS(3) BSD 库函数手册 遍历文件夹(一)


    一、名称

      fts -- 遍历一个文件层次

    二、库

      标准C库(libc, -lc)

    三、说明书

      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fts.h>

      FTS * fts_open(char * const *path_argv, int options,
            int (*compar)(const FTSENT **, const FTSENT **));

      FTS * fts_open_b(char * const *path_argv, int options,
            int (^compar)(const FTSENT **, const FTSENT **));

      FTSENT * fts_read(FTS *ftsp);

      FTSENT * fts_children(FTS *ftsp, int options);

      int fts_set(FTS *ftsp, FTSENT *f, int options);

      int fts_close(FTS *ftsp);

    四、描述

      fts 函数用来遍历UNIX 文件层次。一个简单实现是用函数fts_open()和fts_open_b()返回一个文件层次上的"handle(句柄)",以供其他函数使用。函数fts_read()返回一个指向文件层次中某个文件信息结构的指针。函数fts_children()返回一个指向一个结构链表的指针,该链表每一项都描述了该文件层次中某个目录的某个文件的信息。一般,文件夹以两次不同方式访问:前序(任何descendants(后裔)被访问前)和后序(所有descendants(后裔)被访问后)。文件则被访问一次。 可以"logically(逻辑地)"(忽略符号链接)或者"physically(物理地)"(访问符号链接)遍历层次,可以整理层次结构或删减层次,也可以重访部分层次。

      在文件<fts.h>里定义了2个结构。 一个是FTS,代表文件层次本身,另一个是FTSENT,该结构代表文件层次里的文件。正常情况下,每个文件都会返回一个FTSENT结构。在本手册,"file" 和 "FTSENT"结构 通常可以互换。

    FTSENT结构至少包含以下字段,这些字段在下面有更详细的描述:

      typedef struct  _ftsent{

      u_short fts_info;       /*FTSENT结构的标志*/
      char *fts_accpath;      /*access path(访问路径)*/
      
    char *fts_path;         /*root path(根路径)*/
      u_short fts_pathlen;     /* strlen(fts_path) */
      char *fts_name;         /* file name */
      u_short fts_namelen;      /* strlen(fts_name) */
      short fts_level;        /* depth深度 (-1 to N) */
      int fts_errno;        /* file errno (文件错误编号)*/
      long fts_number;      /* local numeric value(本地的数值) */  
      void *fts_pointer;        /* local address value (本地的地址)*/   
        struct ftsent *fts_parent;      /* parent directory */
      struct ftsent *fts_link;       /* next file structure(下个文件结构)*/
      struct ftsent *fts_cycle;    /* cycle structure(循环结构) */
      struct stat *fts_statp;      /* stat(2) information */
    } FTSENT;

    这些字段的定义如下:

    fts_info
      下列值之一描述了返回的FTSENT结构和它表示的文件。除了不产生错误的目录(FTS_D),所有的这些条目一旦发生错误都将终止,也就是说他们将不再被重新访问,也不访问他们的任何descendants(后裔)。

      FTS_D       被以"pre-order(前序)"方式访问的目录
      FTS_DC     在树(tree)里导致一个循环(cycle)的目录, fts_cycle字段也会被设置
      FTS_DEFAULT  任何代表文件类型的FTSENT结构都不会被其他任何一个fts_info值明确描述
      FTS_DNR     不能读的目录。返回一个error, fts_errno 被设置,用来声明引起本错误的原因
      FTS_DOT    默认情况下,名字为'.'或'..'的文件,不被作为文件名指定给fts_open()或fts_open_b()函数。参见(FTS_SEEDOT)
      FTS_DP     被以"post-order(后序)"访问的目录。从前序访问返回的fts_info字段被设为FTS_D的FTSENT结构的内容不会被改变。
      FTS_ERR    返回一个error, fts_errno会被设置,用来声明引起错误的原因
      FTS_F       一个常规文件
      FTS_NS      文件stat(2)信息不可用。fts_statp内容没有设置。返回一个error,fts_errno会被设置,用来声明引起错误的原因
      FTS_NSOK    文件没请求stat(2)信息。fts_statp内容没有设置

      FTS_SL      符号链接
      FTS_SLNONE   符号链接对象不存在。fts_statp字段内容引用了符号链接自身的文件特 征信息

    fts_accpath    从当前目录访问文件的路径

    fts_path       遍历起始路径, 该路径包括了指定给函数fts_open() 或 fts_open_b()的路径的前缀

    fts_pathlen    根目录字符串的长度

    fts_name       文件名

    fts_namelen           文件名长度

    fts_level       遍历的深度(-1 - N) , 说明在哪找到这个文件。代表遍历开始点的上一级(或root 根目录)的FTSENT 结构被标记为 FTS_ROOTPARENTLEVEL (-1),而遍历开始的这一级的FTSENT结构被标记为FTS_ROOTLEVEL(0)

    fts_errno      查看函数fts_children() 或 fts_read()返回的FTSENT structure, 其中fts_info 字段被设为FTS_DNR, FTS_ERR 或者FTS_NS, fts_errno 字段包含了外部变量errno的值,该值说明了错误的原因。否则,fts_errno项未定义

    fts_number     这个字段是应用程序使用的,不能被fts函数修改。初始化为0

    fts_pointer     这个字段是应用程序使用的,不能被fts函数修改。初始化为NULL

    fts_parent      一个指向FTSENT结构的指针,该结构引用了该层次中当前文件的父文件,即当前文件的目录。也提供初始入口点的父结构,然而,只有在保证fts_level, fts_number 和 fts_pointer 字段已经初始化的情况下才提供。

    fts_link        当从函数fts_children()返回, fts_link字段在NULL-terminated(以NULL结尾的)目录成员链表中指向下一个结构。否则,fts_link字段未定义。

     fts_cycle        如果一个目录在hierarchy(层)里导致一个循环错误,可能是因为两个目录之间的硬链接,或因为符号链接指向了一个目录,结构中的fts_cycle字段会指向hierarchy(层)中跟当前FTSENT结构引用同一个文件的其他FTSENT结构。 否则fts_cycle字段未定义

    fts_statp      指向文件stat(2)信息的指针

      一个单一缓冲区是给文件层次中的所有文件的所有路径使用的。因此,函数fts_read()最近返回的文件中的fts_path 和 fts_accpath字段必须以NULL结束。为了使用这些字段去引用任何被其他FTSENT 结构代表的文件,将要求用那个FTSENT结构中的fts_pathlen信息修改这个缓冲区。 任何此类修改都应该在尝试进一步调用fts_read()之前被撤销。fts_name字段永远以NULL结束。

     以上只说明了 结构 FTSENT,其他fts函数说明请看(二)。

      

  • 相关阅读:
    Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
    在执行Action之间检验是否登录
    链接服务器使用方法
    easyui-treegrid节点选择
    SQLServer 存储过程详解
    转载:SQL Server编程基本语法
    【转】SQL Server编程游标
    机器学习14—SVD学习笔记
    机器学习13—PCA学习笔记
    FP Tree算法原理总结(转载)
  • 原文地址:https://www.cnblogs.com/patientAndPersist/p/3068701.html
Copyright © 2020-2023  润新知