コンピューター:C言語講座:ディレクトリ内容の読み出し
概要
ディレクトリの内容をみるにはlsコマンドを使用するのがUNIXでは一般的で、自作のプログラムでディレクトリの内容が必要な場合もパイプでlsコマンドの出力を得る方法を私自信よく使って来ました。C言語講座の「fork,exec,pipeについて」でもサンプルに取り上げているくらいですから。
しかし、最近ディレクトリの内容を読み出す為の関数群が標準であることを知り、あまりに簡単で便利なので、それを紹介します。
使用方法
opendir()関数に内容を見たいディレクトリのパスを渡し、オープンします。失敗するとNULLが返ります。成功するとDIR型のポインタが得られ、これを以降のディレクトリ読み出しに使います。ちょうどfopen()で得られるFILE
*のようなものです。
readdir()にDIR *を渡すと、そのディレクトリ中のはじめの1つの内容を得られます。呼び出すたびに次の内容が得られ、終わりに達するとNULLを返します。
ほかにtelldir()や、seekdir()、rewinddir()がありますが、いずれもFILE
*に対する高水準入出力と同様に使用します。
使用を終える際はclosedir()でクローズします。
なお、コンパイルにはdirent.hが必要です。
このように、ほとんど高水準入出力の入力と同様に操作が出来ます。
サンプル
引数に指示されたディレクトリの内容を標準出力に表示します。引数が無い場合はカレントの内容を表示します。実にシンプルですが、確実にディレクトリの内容が得られます。.、..も含まれるようです。
#include <stdio.h>
#include <dirent.h>
void main(argc,argv)
int argc;
char *argv[];
{
DIR *dir;
struct dirent *dp;
char path[512];
if(argc<=1){
strcpy(path,".");
}
else{
strcpy(path,argv[1]);
}
if((dir=opendir(path))==NULL){
perror("opendir");
exit(-1);
}
for(dp=readdir(dir);dp!=NULL;dp=readdir(dir)){
printf("%s\n",dp->d_name);
}
closedir(dir);
}