opendir, readdir, closedirを駆使して、lsコマンドを作る


ディレクトリ操作の基本であるopendir, readdir, closedirの基本的な使い方について勉強しました。



/* myls.c */

#include<stdio.h> /* fprintf */
#include<stdlib.h> /* exit */
#include<sys/types.h> /* opendir readdir closedir */
#include<dirent.h> /* opendir readdir closedir */

/*
#include<sys/types.h>
#include<dirent.h>
DIR *opendir(const char *path);

#include<sys/types.h>
#include<dirent.h>
struct dirent *readdir(DIR *d);

#include<sys/types.h>
#include<dirent.h>
int closedir(DIR *d);

*/

static void do_ls(char *path);

int main(int argc, char *argv[])
{
int i;
/*コマンドライン引数が無いときは、stderrにコメントを出力*/
if(argc <2){
fprintf(stderr, "%s: no arguments\n", argv[0]);
exit(1);
}

for(i = 1; i< argc; i++){
do_ls(argv[i]);
}
exit(0);
}


static void do_ls(char *path)
{
DIR *d;
struct dirent *ent;
/* pathにあるディレクトリを読み込むために開く。戻り値はDIRという型へのポインタ。*/
d = opendir(path);
if(!d){
perror(path);
exit(1);
}
/*ディレクトリストリームdからエントリを一つずつ読み込む。
読み込んだエントリをstruct direntで返す。
ディレクトリエントリは、ディレクトリの中身の情報を含んだ構造体。
 */
while(ent = readdir(d)){
fprintf(stdout,"%s  ", ent->d_name);
}
/*ディレクトリストリームを閉じる*/
closedir(d);
fprintf(stdout,"\n");
}