__readdir2() - ディレクトリー項目の読み取りとファイル情報の取得

標準

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

z/OS®UNIX

両方 OS/390 V2R6

形式

#define _OPEN_SYS_DIR_EXT
#include <dirent.h>

struct dirent *__readdir2(DIR *dir, struct stat *info);

機能説明

__readdir2() 関数は、dir に関連したディレクトリー・ストリーム内の次のディレクトリー項目が記述されている、dirent 構造体へのポインターを戻します。

dirent 構造体には、文字ポインター d_name が含まれて おり、これがディレクトリー内のファイル名を付けるストリングを指しています。このストリングは、終了の NULL で終わり、最大 NAME_MAX 文字が入っています。

info 引数は、ファイル d_name に関する情報が入 るストレージの領域を指します。 この情報は、sys/stat.h ヘッダー・ファイルで定義されたように、stat 構造体に戻されます。この構造体の形式は、lstat() 関数に関する トピックに記述されています。info が NULL の場合、stat 情報は渡されません。

ドットまたはドット・ドットのエントリーが存在している場合には、1 つのエントリーが ドット用に戻され、1 つの項目がドット・ドット用に戻されることになります。そのようになっていない場合には、これらのエントリーは戻されません。

__readdir2() の呼び出しで、同じディレクトリー・ストリームの __readdir2() または readdir() への前回の呼び出しによって作成されたデータが上書き されます。異なるディレクトリー・ストリームの呼び出しでは、相互のデータは上書きされません。

closedir() によって dirent データは解放されるので、必要に応じて、closedir() を呼び出す前に readdir2() の dirent データを保管してください。

__readdir2() 関数は、実際の読み取り操作ごとに複数のディレクトリー項目をバッファーに入れることができます。ディレクトリーが実際に読み取られるたびに、__readdir2() はディレクトリーの st_atime (アクセス時刻) フィールドを更新します。

fork() の呼び出しの後、親または子のいずれか (両方ではない) が、__readdir2()、readdir()、rewinddir() または seekdir() を使ってディレクトリー・ストリームの処理を続行することができます。親と子の両方のプロセスでこれらの関数を使用すると、結果は未定義です。

エントリーでシンボリック・リンクの名前を指定すると、dirent 構造体の d_ino メンバーの値が未指定になります。

__readdir2() を呼び出す前に、closedir() を使ってディレクトリー・ストリームをクローズすると、予期しない結果になる場合があります。ディレクトリーのオープン以後にディレクトリーの内容が変更されている (ファイルが追加 されるか削除されている) 場合は、後続の _readdir2() 要求で新しい内容を読み取れるように するため、rewinddir() を呼び出してください。

この関数からの出力は、readdir() と lstat() の組み合わせに似ています。 場合によっては、出力 stat 構造体内のある特定の情報と、lstat() が 戻す情報とが異なることもあります。また、__readdir2() の場合、dir 内の d_extra フィールドは、常に NULL です。

戻り値

正常に実行された場合、__readdir2() は、ディレクトリー・ストリームの 次のディレクトリーを記述している dirent 構造体へのポインター を戻します。__readdir2() がディレクトリー・ストリームの終わりに達すると、NULL ポインター を戻します。

正常に実行されなかった場合は、__readdir2() は、NULL ポインターを戻し、errno を以下のいずれかの値に設定します。
エラー・コード
説明
EBADF
dir は、オープン・ディレクトリー・ストリームをもたらしません。
EINVAL
バッファーが小さすぎて、すべてのディレクトリーは入りませんでした。
ELOOP
ループがシンボリック・リンクに存在しています。このエラーが発生 するのは、ディレクトリー内のファイル名で検出されたシンボリック・リンクの数が POSIX_SYMLOOP より大きい場合です。
ENOENT
ディレクトリー・ストリームの現在位置が無効です。

関連情報