ディレクトリの配下には,いくつかのファイルやサブディレクトリが配置されています.
ここでは,ディレクトリに登録されているそれらの項目の名前を取得する方法について説明します.
1. ディレクトリを開く
指定した名前のディレクトリを開くには opendir 関数を呼び出します.
この関数はディレクトリに関する情報を収めた DIR 構造体へのポインタを戻り値として返します.
処理が失敗すると NULL を返します.
ディレクトリを開いた後は,そのポインタが指し示す構造体のメンバにアクセスすることでディレクトリに関する情報を取得することができます.
例 char *path に与えられたディレクトリを開く
DIR *dr; dr = opendir(path); |
2. ディレクトリ配下の項目を取得する
readdir 関数を呼び出すことで開いたディレクトリの配下の項目を1つづつ取得することができます.
この関数は,項目の情報を格納する dirent 構造体へのポインタを戻り値として返します.
(項目を全部取得してしまった後は戻り値は NULL となります)
例 dr として開いたディレクトリから項目を取得する
struct dirent *de; de=readdir(dr) |
dirent 構造体の定義
struct dirent { ino_t d_ino; /* inode 番号 */ off_t d_off; unsigned short d_reclen; /* このレコードの長さ */ unsigned char d_type; /* ファイル種別 */ char d_name[256]; /* ファイル名 */ }; |
de->d_name を参照することで項目のファイル名を取得できる.
3. ディレクトリを閉じる
ディレクトリへのアクセスが終われば,閉じる必要があります.
開いたディレクトリを閉じるには関数 closedir を呼び出します.
例 dr として開いたディレクトリを閉じる
closedir(dr); |
サンプルプログラム: 指定したディレクトリ配下の項目を全てリストアップする
#include <stdio.h> #include <sys/types.h> #include <dirent.h> int main(ac,av) int ac; char **av; { char *path; DIR *dr; struct dirent *de; int i = 0; path = av[1]; dr = opendir(path); if ( dr == NULL ) { fprintf(stderr,"Can not open directory: %s\n",path); return(-1); } while ( -1 ) { if ( (de=readdir(dr)) == NULL ) { break; } i++; printf("item %03d: %s\n",i,de->d_name); } closedir(dr); } |
実行例: 上のサンプルを s_opendir.c として作って実行する.
プログラム本体が次のようなディレクトリにあるものとする.
$ ls -la total 1200 drwxr-xr-x 16 user1 staff 544 3 27 19:47 . drwxr-xr-x+ 166 user1 staff 5644 2 28 15:04 .. -rw------- 1 user1 staff 12288 3 27 19:47 .s_opendir.c.swp -rwxr-xr-x 1 user1 staff 369 6 1 2014 cmd1 -rw-r--r-- 1 user1 staff 360 6 1 2014 inp -rwxr-xr-x 1 user1 staff 8936 3 15 16:55 s_fstat -rw-r----- 1 user1 staff 1488 3 15 16:55 s_fstat.c -rwxr-xr-x 1 user1 staff 8780 3 27 19:47 s_opendir -rw-r--r-- 1 user1 staff 423 3 27 19:47 s_opendir.c -rwxr-xr-x 1 user1 staff 8688 3 16 19:29 s_time -rw-r--r-- 1 user1 staff 450 3 16 19:29 s_time.c -rwxr-xr-x 1 user1 staff 8568 3 15 21:49 s_timeb -rw-r--r-- 1 user1 staff 333 3 16 20:08 s_timeb.c lrwxr-xr-x 1 user1 staff 9 3 15 16:22 sl -> s_fstat.c -rw-r--r--@ 1 user1 staff 258640 3 15 16:26 sl2 -rw-r--r--@ 1 user1 staff 258640 3 15 20:57 sl3 |
ここでプログラムを実行して,このディレクトリ自身 “.” の中身をリストアップする.
$ s_opendir . item 001: . item 002: .. item 003: .s_opendir.c.swp item 004: cmd1 item 005: inp item 006: s_fstat item 007: s_fstat.c item 008: s_opendir item 009: s_opendir.c item 010: s_time item 011: s_time.c item 012: s_timeb item 013: s_timeb.c item 014: sl item 015: sl2 item 016: sl3 |