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函数说明请看(二)。

  

原文地址:https://www.cnblogs.com/patientAndPersist/p/3068701.html