ディレクトリを開く

ディレクトリの配下には,いくつかのファイルやサブディレクトリが配置されています.
 
ここでは,ディレクトリに登録されているそれらの項目の名前を取得する方法について説明します.
 
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

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)