DIRECTORY(3)

名称
opendir, readdir, telldir, seekdir, rewinddir, closedir, dirfd - ディレクトリ操作

書式
#include <sys/types.h> #include <dirent.h> DIR * opendir(const char *filename) struct dirent * readdir(DIR *dirp) long telldir(const DIR *dirp) void seekdir(DIR *dirp, long loc) void rewinddir(DIR *dirp) int closedir(DIR *dirp) int dirfd(DIR *dirp)

解説
opendir() 関数は、 filename で指名されたディレクトリを開き、 ディレクトリストリーム をそれに対応させ、後続の操作での ディレクトリストリーム を識別するのに使用するポインタを返します。 filename に アクセスできない場合、またはすべてのものを保持するのに十分なメモリを malloc(3) できない場合は、ポインタ NULL が返されます。

readdir() 関数は、次のディレクトリエントリを指すポインタを返します。この 関数は、ディレクトリの末尾に到達するか、または無効な seekdir() 操作を 検出すると NULL を返します。

telldir() 関数は、名前の付いた ディレクトリストリーム に対応する現在の位置を返します。 telldir() が返す値が良いのは、派生させられる元となった DIR ポインタ dirp の寿命の間だけです。ディレクトリが閉じられ再び開かれると、 telldir() が返した以前の値はもはや有効ではありません。

seekdir() 関数は、 ディレクトリストリーム への次の readdir() 操作の位置を設定します。新しい位置は、 telldir() 操作が実行されたときの ディレクトリストリーム と対応付けられたものに戻ります。

rewinddir() 関数は、名前の付いた ディレクトリストリーム の位置をディレクトリの先頭にリセットします。

closedir() 関数は、名前の付いた ディレクトリストリーム を閉じ、 dirp ポインタに対応する構造を解放し、処理が成功した場合は 0 を返します。 処理が失敗すると、-1 が返され、グローバル変数 errno が設定されてエラーを示すようになります。

dirfd() 関数は、名前の付いた ディレクトリストリーム に対応する整数ファイル記述子を返します。 open(2) を参照してください。

ディレクトリでエントリ「name」を検索するサンプルコードは次のとおりです。

    len = strlen(name);
    dirp = opendir(".");
    while ((dp = readdir(dirp)) != NULL)
    	if (dp->d_namlen == len && !strcmp(dp->d_name, name)) {
    		(void)closedir(dirp);
    		return FOUND;
    	}
    (void)closedir(dirp);
    return NOT_FOUND;

関連項目
close(2), lseek(2), open(2), read(2), dir(5)

歴史
opendir(), readdir(), telldir(), seekdir(), rewinddir(), closedir(), および dirfd() の各関数は 4.2BSD で現れました。