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