C または C++ を使用してディレクトリ内のファイルのリストを取得するにはどうすればよいですか?

2017 年更新 :

C++17 では、ファイル システムのファイルを一覧表示する公式の方法があります:std::filesystem . Shreevardhan から素晴らしい回答があります 以下にこのソース コードを示します:

#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main()
{
    std::string path = "/path/to/directory";
    for (const auto & entry : fs::directory_iterator(path))
        std::cout << entry.path() << std::endl;
}

古い回答:

ブーストを使用しない小さくて単純なタスクでは、dirent.h を使用します これは Windows でも利用できます:

DIR *dir;
struct dirent *ent;
if ((dir = opendir ("c:\\src\\")) != NULL) {
  /* print all the files and directories within directory */
  while ((ent = readdir (dir)) != NULL) {
    printf ("%s\n", ent->d_name);
  }
  closedir (dir);
} else {
  /* could not open directory */
  perror ("");
  return EXIT_FAILURE;
}

これは単なる小さなヘッダー ファイルであり、ブーストのような大規模なテンプレート ベースのアプローチを使用せずに、必要な単純な処理のほとんどを実行します (悪気はありません。ブーストが好きです!)。

Windows 互換レイヤーの作成者は Toni Ronkko です。 Unix では、標準ヘッダーです。


C++17 には std::filesystem::directory_iterator が追加されました として使用できます

#include <string>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main() {
    std::string path = "/path/to/directory";
    for (const auto & entry : fs::directory_iterator(path))
        std::cout << entry.path() << std::endl;
}

また、std::filesystem::recursive_directory_iterator サブディレクトリも反復できます。


残念ながら、C++ 標準では、この方法でファイルとフォルダーを操作する標準的な方法は定義されていません。

クロス プラットフォームの方法はないため、ブースト ファイルシステム モジュールなどのライブラリを使用するのが最適なクロス プラットフォームの方法です。

クロス プラットフォーム ブースト方式:

上記のブースト ページからのソース。

Unix/Linux ベースのシステムの場合:

opendir / readdir / closedir を使用できます。

上記の man ページからのソース コード。

Windows ベースのシステムの場合:

Win32 API の FindFirstFile / FindNextFile / FindClose 関数を使用できます。

上記の msdn ページからのソース コード。