ftw() - ファイル・ツリーの全探索

標準

標準/拡張機能 C/C++ 依存項目

XPG4
XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _XOPEN_SOURCE
#include <ftw.h>

int ftw(const char *path,
        int (*fn)(const char *, const struct stat *, int),
        int ndirs);

機能説明

ftw() 関数は、path をルートとするディレクトリー階層を 下へ再帰的にたどります。階層内の各オブジェクトごとに、ftw() は、fn が指す関数を 呼び出します。ftw() は、その関数に、オブジェクト名を含む NULL 終了ストリング へのポインター、オブジェクトに関する情報を含む stat 構造体への ポインター、および整数を渡します。<ftw.h> ヘッダーに定義されているこの整数の取る値は、以下 のとおりです。
FTW_D
ディレクトリーの場合。
FTW_DNR
読み取れないディレクトリーの場合。
FTW_F
ファイルの場合。
FTW_SL
シンボリック・リンクの場合。
FTW_NS
stat() が正常に実行されなかったシンボリック・リンク以外の オブジェクトの場合。オブジェクトがシンボリック・リンクのときに stat() が失敗した 場合、ftw() が FTW_SL または FTW_NS をユーザー提供の関数へ渡すかどうか は指定されていません。

整数が FTW_DNR である場合は、そのディレクトリーの子孫は処理されません。整数が FTW_NS である場合は、stat 構造体には未定義な値が含まれます。FTW_NS を fn で指定される関数へ受け渡すオブジェクトの例は 、読み取り許可は持つが、実行 (検索) 許可は持たないディレクトリー内のファ イルです。

ftw() 関数は、ディレクトリーの子孫のいずれかを走査する前に、ディレクトリーを走査します。

ftw() 関数は、ツリー内のレベルごとに多くても 1 つのファイル記述子 を使用するだけです。

ndirs 引数は、1 ~ OPEN_MAX の範囲 内でなければなりません。

ツリーを完全に走査するか、fn の呼び出しでゼロ以外の値が戻るか、またはその他のエラー ([EACCES] 以外) が ftw() で検出される までは、ツリー巡回が継続されます。

ndirs 引数は、ツリーの走査中に ftw() が使用できる ディレクトリー・ストリームかファイル記述子またはこの両方の最大数を 指定します。ftw() は、戻り時には、使用したディレクトリー・ストリームと ファイル記述子をクローズします。ただし、アプリケーション提供 の fn 関数によってオープンされたものは、クローズの対象に 含まれません。

z/OS UNIX の大規模ファイルのサポート: AMODE 64 C/C++ アプリケーションの場合は、z/OS UNIX の大規模ファイルが自動的にサポートされます。AMODE 31 C/C++ アプリケーションは、オプション LANGLVL(LONGLONG) を指定してコンパイルされなければなりません。また、ヘッダーがインクルードされる前に _LARGE_FILES フィーチャー・テスト・マクロを定義して、2 GB のサイズより大きい z/OS UNIX ファイルをこの関数が操作できるようにしなければなりません。ファイル・サイズとオフセット・フィールドは、63 ビットの幅に拡張されます。したがって、_LARGE_FILES フィーチャー・テスト・マクロの定義も行うには、ファイルを操作する他のいずれかの関数が必要です。

戻り値

ツリーを完全に走査すると、ftw() は 0 を戻します。fn が指す関数がゼロ以外の値を戻すと、ftw() は、ツリー巡回を停止し、fn() が指す関数で戻された値が何であってもその値を戻します。

ftw() は、エラーを検出すると -1 を戻し、errno を次のいずれかの値に設定します。ftw() によって戻された他の errnos は、すべて未変更です。
エラー・コード
説明
EACCES
検索許可は path のコンポーネントで拒否されたか、または読み取り許可が path で拒否されました。
EINVAL
ndirs 引数の値が無効です。
ELOOP
シンボリック・リンクが大量に検出されました。
ENAMETOOLONG
次のエラー条件のいずれかが存在しています。
  • シンボリック・リンクのパス名解決が、PATH_MAX を超える 長さの中間結果を作成しました。
  • path の長さが PATH_MAX を超えているか、またはパス名コンポーネントが PATH_MAX より長くなっています。
ENOENT
path のコンポーネントが既存ファイルの名前を指定していないか、または path が空ストリングです。
ENOTDIR
path のコンポーネントがディレクトリーではありません。

関連情報