C++ でディレクトリ内のファイルの一覧を取得する方法
-
ディレクトリ内のファイルの一覧を取得するには
std::filesystem::directory_iterator
を使用する -
ディレクトリ内のファイルのリストを取得するには
opendir/readdir
関数を利用する -
すべてのサブディレクトリのファイルの一覧を取得するには
std::filesystem::recursive_directory_iterator
を使用する
この記事では、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
という特殊な構造体を返す(詳細はこちら)。
一度 readdir
を nullptr
と比較して 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;
}
関数 opendir
や readdir
はディレクトリのエラー/終了時に 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;
}