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

胡金庫 2023年10月12日
  1. ディレクトリ内のファイルの一覧を取得するには std::filesystem::directory_iterator を使用する
  2. ディレクトリ内のファイルのリストを取得するには opendir/readdir 関数を利用する
  3. すべてのサブディレクトリのファイルの一覧を取得するには std::filesystem::recursive_directory_iterator を使用する
C++ でディレクトリ内のファイルの一覧を取得する方法

この記事では、C++ で指定したディレクトリ内のファイルの一覧を取得する方法を紹介します。

ディレクトリ内のファイルの一覧を取得するには std::filesystem::directory_iterator を使用する

このメソッドは、C++17 で追加された <filesystem> ライブラリの一部です。古いコンパイラではこのメソッドがサポートされていない場合がありますが、これはディレクトリ内のファイルの一覧を取得するためのネイティブの C++ ソリューションです。ディレクトリへのパスを引数にとります。この例ではルートディレクトリへのパスを指定していますが、有効なパスを渡すためにはシステムに応じてこの変数を変更する必要があります。

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::directory_iterator;

int main() {
  string path = "/";

  for (const auto& file : directory_iterator(path)) cout << file.path() << endl;

  return EXIT_SUCCESS;
}

出力(ディレクトリに依存する)。

Archive2| lib| .| ..| lib64| Archive| dev| var| bin| usr| etc| tmp| proc|

ディレクトリ内のファイルのリストを取得するには opendir/readdir 関数を利用する

この方法ははるかに冗長ですが、ファイルシステムを操作するための信頼できる代替手段です。

関数 opendir/readdir を利用するには、dirent.h ヘッダファイルをインクルードする必要があります。

opendir は名前で指定されたディレクトリを開き、そのポインタを返します。

readdir は引数の DIR*を操作して、dirent という特殊な構造体を返す(詳細はこちら)。

一度 readdirnullptr と比較して while ループに入れると、ディレクトリのイテレータとして動作し、返された dirent 構造体を介してファイル名にアクセスできるようになります。

#include <dirent.h>

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main() {
  DIR *dir;
  struct dirent *diread;
  vector<char *> files;

  if ((dir = opendir("/")) != nullptr) {
    while ((diread = readdir(dir)) != nullptr) {
      files.push_back(diread->d_name);
    }
    closedir(dir);
  } else {
    perror("opendir");
    return EXIT_FAILURE;
  }

  for (auto file : files) cout << file << "| ";
  cout << endl;

  return EXIT_SUCCESS;
}

関数 opendirreaddir はディレクトリのエラー/終了時に NULL ポインタを返すので、if 文の多くは例外処理の仕組みとして機能していることに注意してください。

すべてのサブディレクトリのファイルの一覧を取得するには std::filesystem::recursive_directory_iterator を使用する

このメソッドは、複数のサブディレクトリから特定のファイル名を検索したい場合に便利です。このメソッドは directory_iterator と同じです。このメソッドを範囲ベースのループでループし、必要に応じてファイルを操作すればよいだけです。

#include <filesystem>
#include <iostream>
#include <string>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::filesystem::recursive_directory_iterator;

int main() {
  string path = "./";

  for (const auto& file : recursive_directory_iterator(path))
    cout << file.path() << endl;

  return EXIT_SUCCESS;
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ File