lsコマンドのソース(FreeBSD版)つづき
ファイル階層そのものを表現する FTS 構造体である。
「ファイル」と 「FTSENT 構造体」を一般に読み変えることができる。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fts.3.html
479 FTS *ftsp; 480 FTSENT *p, *chp; 481 int ch_options; 482 483 if ((ftsp = 484 fts_open(argv, options, f_nosort ? NULL : mastercmp)) == NULL) 485 err(1, "fts_open");
fts_open() 関数は、他の fts 関数に供給される、ファイル階層の ``ハンドル''
http://www.jp.freebsd.org/cgi/mroff.cgi?sect=3&cmd=&lc=1&subdir=man&dir=jpman-6.0.0%2Fman&subdir=man&man=fts#sect6
を返すということです。
491 chp = fts_children(ftsp, 0); 492 if (chp != NULL) //ファイルを含んでいる場合 493 display(NULL, chp, options); //display関数をよぶ 494 if (f_listdir) //ディレクトリだけ表示するならtraverseをぬける 495 return;
504 while ((p = fts_read(ftsp)) != NULL) 505 switch (p->fts_info) { 506 case FTS_DC:
FTS *
fts_open(char * const *path_argv, int options,
int (*compar)(const FTSENT * const *, const FTSENT * const *));
第一引数のパスのハンドラのポインタを返す。
複数パスをいっぺんに渡しても1つのハンドラを返すのか・・
第三引数の関数ポインタは・・ソート用の関数を渡すらしい
FTSENT *
fts_read(FTS *ftsp);
渡したハンドラでファイル情報のポインタを1こ返す
FTSENT *
fts_children(FTS *ftsp, int options);
渡したハンドラでファイル情報のリンクリストの先頭のポインタを返す
int
fts_set(FTS *ftsp, FTSENT *f, int options);
該当のファイル(ディレクトリ)の子を探すのをスキップする設定とかできる
ためしに
1 #include <stdio.h> 2 #include <fts.h> 3 4 int main() 5 { 6 FTS *ftsp; 7 FTSENT *p; 8 char *dir[] = {"/home/teegee/packages",NULL}; 9 ftsp = fts_open(dir, 0, NULL); 10 11 while((p = fts_read(ftsp)) != NULL) { 12 printf("%s\n", p->fts_path); 13 printf("%s\n", p->fts_name); 14 } 15 16 return 0; 17 }
fts_readはディレクトリにぶつかったら、そのディレクトリを掘っていくことがわかった。
掘り切ったらまた戻ってくる。
掘られるディレクトリは2回登場する。