FTS
Section: C Library Functions (3)
Index
JM Home Page
roff page
BSD mandoc
名前
fts
fts_open
fts_read
fts_children
fts_set
fts_close
- ファイル階層をたどる
SYNOPSIS (書式)
Fd #include <sys/types.h>
Fd #include <sys/stat.h>
Fd #include <fts.h>
Ft FTS *
Fn fts_open char * const *path_argv int options int (*compar)(const FTSENT **, const FTSENT **)
Ft FTSENT *
Fn fts_read FTS *ftsp
Ft FTSENT *
Fn fts_children FTS *ftsp int options
Ft int
Fn fts_set FTS *ftsp FTSENT *f int options
Ft int
Fn fts_close FTS *ftsp
説明
fts
関数は、
UNIX
ファイル階層をたどるために提供されている。
簡単に概略すると次のようになる。
Fn fts_open
関数は、
他の
fts
関数に渡すための、ファイル階層の「ハンドル」を返す。
関数
Fn fts_read
は、ファイル階層中にある 1 つのファイルを記述する
構造体へのポインタを返す。
関数
Fn fts_children
は、階層中のディレクトリにあるファイルを記述する
構造体のリンクリストへのポインタを返す。
一般にディレクトリは、
pre-order (正方向:下の階層のディレクトリをたどる前) と
post-order (逆方向:下の階層のディレクトリをすべてたどった後) という、
異なる方向で 2 回たどられる。ファイルは 1 回たどられる。
ディレクトリ階層を「論理的に」(シンボリックリングを無視して) 移動することも、
物理的に (シンボリックリンクをたどって) 移動することも可能である。
また、階層中の移動の道筋を指示すること・
余分なものを取り除くこと・階層の一部を再びたどることが可能である。
2 つの構造体がインクルードファイル
Aq Pa fts.h
で定義されている (さらに typedef されている)。
1 つ目は、ファイル階層そのものを表現する
Fa FTS
構造体である。
2 つ目は、ファイル階層中のファイルを表現する
Fa FTSENT
構造体である。
Fa FTSENT
構造体は通常、ファイル階層中のすべてのファイルに対して返される。
この man ページでは、「ファイル」と
Fa 「 FTSENT
構造体」を一般に読み変えることができる。
Fa FTSENT
構造体は、少なくとも次のようなフィールドを持っており、
以下でより詳しく説明されている。
typedef struct _ftsent {
u_short fts_info; /* FTSENT 構造体のためのフラグ */
char *fts_accpath; /* アクセスパス */
char *fts_path; /* ルートパス */
short fts_pathlen; /* fts_path の長さ */
char *fts_name; /* ファイル名 */
short fts_namelen; /* fts_name の長さ */
short fts_level; /* 深さ (-1 〜 N) */
int fts_errno; /* ファイルのエラー番号 */
long fts_number; /* ローカルな番号 */
void *fts_pointer; /* ローカルなアドレス番号 */
struct ftsent *fts_parent; /* 親ディレクトリ */
struct ftsent *fts_link; /* 次のファイル構造体 */
struct ftsent *fts_cycle; /* 循環している構造体 */
struct stat *fts_statp; /* stat(2) の情報 */
} FTSENT;
これらのフィールドは、次のように定義されている。
- Fa fts_info
-
このフィールドは、返された
Fa FTSENT
構造体とファイルを説明する以下のフラグのいずれかを表している。
エラーのないディレクトリ
(FTS_D
)
の場合は例外として、それ以外のすべてのエントリは終端である。
つまり、エントリは再びたどられることもなく、
それより下の階層がたどられることもない。
- FTS_D
-
pre-order でたどられるディレクトリ。
- FTS_DC
-
ツリーの中で循環しているディレクトリ。
Fa ( FTSENT
構造体の
Fa fts_cycle
フィールドも同様に埋められる。)
- FTS_DEFAULT
-
ファイルタイプを表現する
Fa FTSENT
構造体が、
Fa fts_info
の他のいずれかの値で明示的に説明されていない。
- FTS_DNR
-
読み込みができないディレクトリ。
これはエラーの場合の返り値であり、
何がエラーを起こしたかを示すために
Fa fts_errno
フィールドが設定される。
- FTS_DOT
-
Fn fts_open
へのファイル名として指定されなかった
`.'
または
`..'
という名前のファイル
( FTS_SEEDOT
を参照すること)。
- FTS_DP
-
post-order でたどられるディレクトリ。
Fa FTSENT
構造体の内容は、pre-order のときに返された状態
(つまり、
Fa fts_info
フィールドが
FTS_D
に設定されている状態) から変更されない。
- FTS_ERR
-
これはエラーの場合の返り値であり、
Fa fts_errno
フィールドは、何がエラーを起こしたかを示す値に設定される。
- FTS_F
-
通常のファイル。
- FTS_NS
-
stat(2)
情報が得られなかったファイル。
Fa fts_statp
フィールドの内容は定義されない。
これはエラーの場合の返り値であり、
Fa fts_errno
フィールドは、何がエラーを起こしたかを示す値に設定される。
- FTS_NSOK
-
stat(2)
情報が要求されなかったファイル。
Fa fts_statp
フィールドの内容は定義されない。
- FTS_SL
-
シンボリックリンク。
- FTS_SLNONE
-
リンク先の存在しないシンボリックリンク。
Fa fts_statp
フィールドの内容は、シンボリックリンクそのもののファイル特性情報を参照する。
- Fa fts_accpath
-
現在のディレクトリからファイルにアクセスするためのパス。
- Fa fts_path
-
階層をたどるときのルートからみたファイルの相対的なパス。
このパスには、
Fn fts_open
に指定したパスがプレフィックスとして含まれる。
- Fa fts_pathlen
-
Fa fts_path
で参照される文字列の長さ。
- Fa fts_name
-
ファイルの名前。
- Fa fts_namelen
-
Fa fts_name
で参照される文字列の長さ。
- Fa fts_level
-
階層をたどって、このファイルがみつかった深さ。
-1 〜 N の数値で表される。
階層をたどるときの出発点 (ルート) の親ディレクトリを表す
Fa FTSENT
構造体では -1 となる。
また、ルート自身の
Fa FTSENT
構造体では 0 になる。
- Fa fts_errno
-
関数
Fn fts_children
と
Fn fts_read
から返される
Fa FTSENT
構造体の
Fa fts_info
フィールドが
FTS_DNR
FTS_ERR
FTS_NS
に設定されている場合、
Fa fts_errno
フィールドにはエラーの原因を示す外部変数
errno
の値が入る。
それ以外の場合、
Fa fts_errno
フィールドの内容は定義されない。
- Fa fts_number
-
このフィールドは、アプリケーションプログラムから使用するために提供され、
fts
関数では変更されない。
このフィールドは 0 で初期化される。
- Fa fts_pointer
-
このフィールドは、アプリケーションプログラムから使用するために提供され、
fts
関数では変更されない。
このフィールドは
NULL
で初期化される。
- Fa fts_parent
-
現在のファイルのすぐ上の階層にあるファイル
(つまり、現在のファイルがメンバーになっているディレクトリ) を参照する
Fa FTSENT
構造体へのポインタ。
最初の出発点に対しても、親となる構造体は与えられる。
しかし、
Fa fts_level ,
Fa fts_number ,
Fa fts_pointer
フィールドのみの初期化しか保証されない。
- Fa fts_link
-
Fn fts_children
から返される場合、
Fa fts_link
フィールドはディレクトリメンバーの NUL 終端されたリンクリストの形式で、
次の構造体を指し示す。
それ以外の場合、
Fa fts_link
フィールドは定義されない。
- Fa fts_cycle
-
2 つのディレクトリにハードリンクが張られているため、
または、シンボリックリンクがあるディレクトリを指しているために、
ディレクトリが循環する階層構造を作っている場合
( FTS_DC
を参照)、
構造体の
Fa fts_cycle
フィールドは、階層中で現在の
Fa FTSENT
構造体と同じファイルを参照している
Fa FTSENT
構造体を指し示す。
それ以外の場合、
Fa fts_cycle
フィールドは定義されない。
- Fa fts_statp
-
このファイルの
stat(2)
情報へのポインタ。
ファイル階層中のすべてのファイルのパスに対して、
ただ 1 つのバッファーが使われる。
したがって、
Fa fts_path
と
Fa fts_accpath
フィールドは、
Fn fts_read
によって返された最も新しいファイルに対して
のみ
NUL
終端されることが保証される。
これらのフィールドを、他の
Fa FTSENT
構造体で表現されるファイルを参照するために使うには、
Fa FTSENT
構造体の
Fa fts_pathlen
フィールドにある情報を使ってパスのバッファーを修正する必要がある。
これらの修正は、さらに
Fn fts_read
を呼び出そうとする場合には、元に戻しておかなければならない。
Fa fts_name
フィールドは、常に
NUL
終端される。
FTS_OPEN
Fn fts_open
関数は、文字列ポインタの配列へのポインタを引き数に取る。
この文字列ポインタは、論理ファイル階層をつくる 1 つ以上のパスの名前になる。
配列は、
NULL
ポインタで終端されなければならない。
多くのオプションがあり、少なくとも 1 つ
( FTS_LOGICAL
または
FTS_PHYSICAL
が指定されなければならない。
次のオプションが
or
をとって選択される。
- FTS_COMFOLLOW
-
このオプションは、
FTS_LOGICAL
の指定にかかわらず、
ルートパスに指定されたシンボリックリンクをすぐにたどらせる。
- FTS_LOGICAL
-
このオプションは、
fts
ルーチンにシンボリックリンクそのものではなく、
シンボリックリンクが指しているファイルの
Fa FTSENT
構造体を返させる。
このオプションが設定された場合、
Fa FTSENT
構造体がアプリケーションに返されるような
シンボリックリンクのみが、存在しないファイルを参照している。
FTS_LOGICAL
または
FTS_PHYSICAL
のどちらかを、
Fn fts_open
関数に与えなければ
ならない。
- FTS_NOCHDIR
-
パフォーマンスの最適化のため、
fts
関数はファイル階層をたどるときディレクトリを変える。
これには、階層をたどっている間は
アプリケーションがある特定のディレクトリにいるということに
依存できない、という副作用がある。
FTS_NOCHDIR
オプションで最適化を無効にすると、
fts
関数は現在のディレクトリを変更しない。
FTS_NOCHDIR
が指定され、かつ
Fn fts_open
の引き数として絶対パス名が与えられたとき以外、アプリケーションは、
自らカレントディレクトリを変更したり、
ファイルにアクセスしたりすべきではない、という点に注意すること。
- FTS_NOSTAT
-
デフォルトでは、返された
Fa FTSENT
構造体は、たどられた各ファイルについてのファイル特徴情報
Fa ( statp
フィールド) を参照する。
このオプションは、
fts
関数が
Fa fts_info
フィールドを
FTS_NSOK
に設定し
Fa statp
の内容を定義されないままにすることを許すことにより、
パフォーマンスの最適化に必要なものを緩和する。
- FTS_PHYSICAL
-
このオプションは、
fts
ルーチンにシンボリックリンクが指しているファイルではなく、
シンボリックリンク自身の
Fa FTSENT
構造体を返させる。
このオプションが設定されると、階層中のすべてのシンボリックリンクの
Fa FTSENT
構造体がアプリケーションに返される。
FTS_LOGICAL
または
FTS_PHYSICAL
のどちらかを
Fn fts_open
関数に与えなければ
ならない。
- FTS_SEEDOT
-
デフォルトでは、
Fn fts_open
のパス引き数として指定されない限り、ファイル階層中にある
`.'
または
`..'
という名前のファイルは無視される。
このオプションは、
fts
ルーチンにこれらのファイルの
Fa FTSENT
構造体を返させる。
- FTS_XDEV
-
このオプションは、
fts
が下り始めのファイルとは異なるデバイス番号を持っている
ディレクトリに下りるのを阻止する。
引き数
Fn compar
は、階層をたどる順番を決めるのに使われるユーザー定義関数を指定する。
この関数は、引き数として
Fa FTSENT
構造体のポインタのポインタを 2 つとり、
1 番目の引き数で参照されているファイルが
2 番目の引き数で参照されているファイルより
前にある場合は負の値・同じ場合はゼロ・後にある場合は正の値を
返さなければならない。
Fa FTSENT
構造体の
Fa fts_accpath ,
Fa fts_path ,
Fa fts_pathlen
フィールドは、この比較に
絶対
使ってはいけない。
Fa fts_info
フィールドが
FTS_NS
または
FTS_NSOK
に設定される場合、
Fa fts_statp
フィールドはこれらのどちらでもない。
Fn compar
引き数が
NULL
の場合、ディレクトリをたどる順番は、ルートパスについては
Fa path_argv
のなかでリストされた順番で、
その他のファイルについてはディレクトリ内でリストされた順番となる。
FTS_READ
Fn fts_read
関数は、階層中のファイルを記述する
Fa FTSENT
構造体へのポインタを返す。
(読み込み可能で、循環していない) ディレクトリは、
1 回は pre-order で、もう 1 回は post-order で、少なくとも 2 回たどられる。
他のファイルは、少なくとも 1 回たどられる。
(ディレクトリ間のハードリンクによって
循環やシンボリックリンクへのシンボリックリンクが起こらない場合、
ファイルは 2 回以上、ディレクトリは 3 回以上たどられる。)
階層中のすべてのメンバーが返された場合、
Fn fts_read
は
NULL
を返し、外部変数
errno
を 0 にする。
階層中のファイルに関係しないエラーが起こった場合、
Fn fts_read
は
NULL
を返し、
errno
をエラーに対応した値にする。
階層中のファイルに関係したエラーが起こった場合、
Fa FTSENT
構造体へのポインタが返され、
errno
は設定される場合と設定されない場合がある
Fa ( fts_info
を参照すること)。
Fn fts_read
によって返される
Fa FTSENT
構造体は、同じファイル階層ストリームへの
Fn fts_close
の呼出しの後に上書きされる。
また、同じファイル階層ストリームへの
Fn fts_read
の呼出しの後でも、構造体がディレクトリを表現していない限り上書きされる。
この場合、
Fn fts_read
関数によって post-order で
Fa FTSENT
構造体が返された後、
Fn fts_read
の呼出しがあるまで、
これらの構造体は上書きされない。
FTS_CHILDREN
Fn fts_children
関数は、
Fa FTSENT
構造体へのポインタを返す。
この構造体は、(
Fn fts_read
で最も新しく返された
Fa FTSENT
構造体で表現されるディレクトリにあるファイルの)
NUL 終端されたリンクリストの最初のエントリを記述する。
このリストは、
Fa FTSENT
構造体の
Fa fts_link
フィールドを使ってリンクされ、
ユーザー指定の比較関数がある場合は、それで順序づけられる。
Fn fts_children
の呼出しを繰り返すことで、
このリンクリストは再生成される。
特別な場合として、
Fn fts_read
がファイル階層について呼ばれていない場合、
Fn fts_children
は
Fn fts_open
に指定された論理ディレクトリ (つまり、
Fn fts_open
に指定された引き数) の中にあるファイルへのポインタを返す。
それ以外の場合で、
Fn fts_read
によって最も新しく返された
Fa FTSENT
構造体が pre-order でたどられたディレクトリでない場合や
何も含んでいないディレクトリの場合は、
Fn fts_children
は
NULL
を返し、
errno
を 0 にする。
エラーが起こった場合、
Fn fts_children
は
NULL
を返し、
errno
をエラーに対応した値にする。
Fn fts_children
によって返される
Fa FTSENT
構造体は、同じファイル階層ストリームへの
Fn fts_children ,
Fn fts_close ,
Fn fts_read
の呼出しの後に上書きされる場合がある。
option
は、次の値に設定できる。
- FTS_NAMEONLY
-
ファイル名のみが必要とされている。
返された構造体のリンクリストの
Fa fts_name ,
Fa fts_namelen
フィールド以外の
すべてのフィールドの内容は定義されない。
FTS_SET
関数
Fn fts_set
は、ユーザーアプリケーションが
ストリーム
Fa ftsp
のファイル
Fa f
について更なる処理を決定すること許す。
Fn fts_set
関数は、成功した場合は 0 を、エラーが起こった場合は -1 を返す。
option
は、次の値のいずれか 1 つに設定されなければならない。
- FTS_AGAIN
-
ファイルを再びたどる。すべてのファイルタイプが再びたどられる。
次の
Fn fts_read
の呼出しにより、参照されているファイルが返される。
構造体の
Fa fts_stat ,
Fa fts_info
フィールドはこの時に初期化されるが、他のフィールドは変更されない。
このオプションは、
Fn fts_read
によって最も新しく返されたファイルについてのみ意味を持つ。
通常は、post-order でディレクトリをたどる場合に使用し、
その下の階層と同様に、
ディレクトリを (pre-order と post-order の両方で) 再びたどらせる。
- FTS_FOLLOW
-
参照されてるファイルは、シンボリックリンクでなければならない。
参照されているファイルが
Fn fts_read
によって最も新しく返されたものである場合、次の
Fn fts_read
の呼出しでは、シンボリックリンクそのものではなく、
シンボリックリンクが指している先を反映するように
Fa fts_info ,
Fa fts_statp
を再び初期化したファイルが返される。
ファイルが
Fn fts_children
によって最も新しく返されたものの 1 つである場合、
Fn fts_read
によって返されたとき、構造体の
Fa fts_info ,
Fa fts_statp
フィールドは、シンボリックリンクそのものではなく、
シンボリックリンクが指している先を反映する。
どちらの場合でも、シンボリックリンクが指している先がないときは、
返された構造体のフィールドは変更されず、
Fa fts_info
フィールドが
FTS_SLNONE
に設定される。
リンク先がディレクトリの場合、
ファイルが pre-order で返された後、下の階層のすべてファイルが返され、
その後で post-order で返される。
- FTS_SKIP
-
このファイルの下の階層はたどられない。
このファイルは、
Fn fts_children
または
Fn fts_read
のどちらかによって最も新しく返されたものの 1 つである。
FTS_CLOSE
Fn fts_close
関数は、ファイル階層ストリーム
Fa ftsp
を閉じる。そして、現在のディレクトリを
Fa ftsp
を開くために
Fn fts_open
が呼ばれたディレクトリに復元する。
Fn fts_close
関数は、成功した場合は 0 を、エラーが起こった場合は -1 を返す。
エラー
関数
Fn fts_open
が失敗した場合、
errno
は、ライブラリ関数
open(2)
と
malloc(3)
に対して指定されるエラーに設定される。
関数
Fn fts_close
が失敗した場合、
errno
は、ライブラリ関数
chdir(2)
と
close(2)
に対して指定されるエラーに設定される。
関数
Fn fts_read
と
Fn fts_children
が失敗した場合、
errno
は、ライブラリ関数
chdir(2),
malloc(3),
opendir(3),
readdir(3),
stat(2)
に対して指定されるエラーに設定される。
更に、
Fn fts_children ,
Fn fts_open ,
Fn fts_set
が失敗した場合、
errno
が次の値にされる。
- Bq Er EINVAL
-
オプションが無効であった。
バージョン
これらの関数は、Linux では glibc2 から使用可能である。
準拠
4.4BSD.
関連項目
find(1),
chdir(2),
stat(2),
ftw(3),
qsort(3)
Index
- 名前
-
- SYNOPSIS (書式)
-
- 説明
-
- FTS_OPEN
-
- FTS_READ
-
- FTS_CHILDREN
-
- FTS_SET
-
- FTS_CLOSE
-
- エラー
-
- バージョン
-
- 準拠
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:31:41 GMT, November 19, 2007