Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語・C++でディレクトリ内のファイル一覧を取得する方法

C++のサンプルコードをもとに、ディレクトリ内のファイル一覧を取得して表示する方法を解説します。ここではPOSIX系システム(Linuxなど)で利用できる dirent.h ヘッダと、opendir()readdir()closedir() の各関数を使用します。

アルゴリズム

開始
  DIR型へのポインタ dr を宣言する。
  dirent構造体へのポインタ en を宣言する。
  opendir()関数を呼び出し、カレントディレクトリを開く。
  ポインタdrを dr = opendir(".") として初期化する。
  if(dr)
    while ((en = readdir(dr)) != NULL)
      en->d_name を使ってすべてのファイル名を出力する。
  closedir()関数を呼び出してディレクトリを閉じる。
終了。

C++での実装例

#include <iostream>
#include <dirent.h>
#include <sys/types.h>
using namespace std;
int main(void) {
  DIR *dr;
  struct dirent *en;
  dr = opendir("."); // カレントディレクトリを開く
  if (dr) {
    while ((en = readdir(dr)) != NULL) {
      cout<<" \n"<<en->d_name; // ファイル名を1件ずつ出力
    }
    closedir(dr); // ディレクトリを閉じる
  }
  return(0);
}

出力結果

BINSEARC.C
BINTREE (1).C
BINTREE.C
BTREE.C
BUBBLE.C
c.txt
file3.txt
HEAP.C
HEAPSORT.C
HLINKLST.C
INSERTIO.C
LINKLIST.C
LINKLST.C
LLIST1.C
players.cpp
PolarRect.cpp
QUEUE.C

このように、カレントディレクトリ(".")に存在するファイルやサブディレクトリの名前が順番に出力されます。なお、readdir() は「.」や「..」といった特殊エントリも返す場合があるため、必要に応じて除外処理を追加するとよいでしょう。

C言語での実装例

同じ処理は、標準入出力の printf() を使ったC言語のコードでも実現できます。

#include <stdio.h>
#include <dirent.h>
int main(void) {
  DIR *dr;
  struct dirent *en;
  dr = opendir("."); // カレントディレクトリを開く
  if (dr) {
    while ((en = readdir(dr)) != NULL) {
      printf("%s\n", en->d_name); // ファイル名を1件ずつ出力
    }
    closedir(dr); // ディレクトリを閉じる
  }
  return(0);
}

出力結果

BINSEARC.C
BINTREE (1).C
BINTREE.C
BTREE.C
BUBBLE.C
c.txt
file3.txt
HEAP.C
HEAPSORT.C
HLINKLST.C
INSERTIO.C
LINKLIST.C
LINKLST.C
LLIST1.C

ポイントまとめ

  • opendir(path): 指定したパスのディレクトリストリームを開き、DIR型ポインタを返します。失敗時はNULLを返します。
  • readdir(dir): ディレクトリから次のエントリを1件ずつ読み込み、dirent構造体へのポインタを返します。末尾に達するとNULLを返します。
  • closedir(dir): 開いたディレクトリストリームを閉じ、リソースを解放します。

この手法はLinuxやmacOSなどのUNIX系環境で動作します。Windows環境では FindFirstFile/FindNextFile APIや、C++17で導入された <filesystem> ライブラリ(std::filesystem::directory_iterator)の利用も検討してください。

  1. Javaでディレクトリからファイルのみを一覧表示する方法を解説

    Javaで特定のディレクトリに含まれる「ファイルのみ」を一覧表示する方法は複数あります。本記事では、代表的な2つの手法――FileFilterインターフェースとlistFiles()メソッドを組み合わせる方法、そしてFiles.walk()とStream APIを使う方法――を、実際のコード例と実行結果とともに解説します。 listFiles()メソッドとFileFilterインターフェースとは java.io.FileクラスのlistFiles()メソッドは、現在のFileオブジェクトが表すパスに存在するすべてのファイルおよびディレクトリのオブジェクト(抽象パス名)を配列として返します。 F

  2. Javaでディレクトリ内のjpgファイル一覧を取得する方法

    FilenameFilterインターフェースを使った方法Fileクラスのlist(FilenameFilter filter)メソッドは、現在のFileオブジェクトが表すパスに存在するすべてのファイルおよびディレクトリの名前をString配列として返します。ただし、返される配列には、指定したフィルター条件を満たすファイル名のみが含まれます。FilenameFilterは、次の単一のメソッドを持つJavaのインターフェースです。accept(File dir, String name)拡張子に基づいてファイル名を取得したい場合は、このインターフェースを実装したクラスを作成し、そのインスタンスをF