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

  1. ディレクトリ内のファイルの一覧を取得するには std::filesystem::directory_iterator を使う
  2. ディレクトリ内のファイルのリストを取得するには opendir/readdir 関数を利用する
  3. すべてのサブディレクトリのファイルの一覧を取得するには std::filesystem::recursive_directory_iterator を使う

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

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

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

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

using std::cout; using std::cin;
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 <iostream>
#include <vector>
#include <dirent.h>

using std::cout; using std::cin;
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 <iostream>
#include <vector>
#include <string>
#include <filesystem>

using std::cout; using std::cin;
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;
}

関連記事 - C++ File

  • C++ でファイルにテキストを追加する方法
  • comments powered by Disqus