メイン画像

C言語 - サブディレクトリとファイルを一覧表示する

C言語 - サブディレクトリとファイルを一覧表示する


C言語でディレクトリを扱ってみる。

以下のプログラムは、カレントディレクトリのサブディレクトリとファイルを一覧表示する。

#include 
#include 

int main(int argc, char *argv[]) {
    char *path = ".";

    DIR *dirp = opendir(path);
    if ( dirp == (DIR*)NULL ) {
        perror("opendir err");
        return 1;
    }

    struct dirent *entry;
    while ( (entry = readdir(dirp)) != (struct dirent *)NULL ) {
        /* カレントディレクトリ、親ディレクトリは除く */
        if ( (strlen(entry->d_name) == 1 && strcmp(entry->d_name, ".") == 0) ||
            (strlen(entry->d_name) == 2 && strcmp(entry->d_name, "..") == 0) ) {
            continue;
        }

        printf("%s\n", entry->d_name);
    }

    if ( closedir(dirp) != 0 ) {
        perror("closedir err");
        return 1;
    }

    return 0;
}

プログラムのポイントは以下のとおり。

  • dirent.h ファイルをインクルードする。
  • opendir 関数でディレクトリをオープンする。
  • readdir 関数でディレクトリエントリ(ディレクトリやファイルの情報のこと)を取得する。
  • closedir 関数でディレクトリをクローズする。

ディレクトリのオープン

opendir 関数は指定したディレクトリをオープンして、readdir 関数で読み取れるようにする。

正常終了した場合は DIR オブジェクトのポインターを返す。

それ以外の場合は NULL ポインターを返す。

DIR *dirp = opendir(path);
if ( dirp == (DIR*)NULL ) {
    perror("opendir err");
    return 1;
}

ディレクトリエントリの取得

readdir 関数でディレクトリエントリを読み取る。

正常終了した場合は dirent 構造体へのポインターを返す。

読み取れるディレクトリエントリがなくなった場合、または正常終了しなかった場合は NULL ポインターを返す。

struct dirent *entry;
while ( (entry = readdir(dirp)) != (struct dirent *)NULL ) {
    /* ~~~ディレクトリエントリを使った処理を書く~~~ */
}

ファイル名(ディレクトリ名)は dirent 構造体の d_name に入っている。

printf("%s\n", entry->d_name);

ディレクトリのクローズ

closedir 関数でディレクトリをクローズする。

正常終了した場合は 0 を、それ以外の場合は -1 を返す。

if ( closedir(dirp) != 0 ) {
    perror("closedir err");
    return 1;
}

なお、こちらで書いた方法は Visual C++ では使えない。

Visual C++ には dirent.h ファイルがないからだ。


アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事