zoukankan      html  css  js  c++  java
  • 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函数说明请看(二)。

      

  • 相关阅读:
    git常用指令 github版本回退 reset
    三门问题 概率论
    如何高效的学习高等数学
    数据库6 关系代数(relational algebra) 函数依赖(functional dependency)
    数据库5 索引 动态哈希(Dynamic Hashing)
    数据库4 3层结构(Three Level Architecture) DBA DML DDL DCL DQL
    梦想开始的地方
    java String字符串转对象实体类
    java 生成图片验证码
    java 对象之间相同属性进行赋值
  • 原文地址:https://www.cnblogs.com/patientAndPersist/p/3068701.html
Copyright © 2011-2022 走看看