如何在 C++ 中獲取目錄中的檔案列表

Jinku Hu 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++ 解決方案。directory_iterator 在一個基於範圍的 for 迴圈中使用,它把目錄的路徑作為引數。在這個例子中,我們指定了根目錄的路徑,但是你應該根據你的系統修改此變數,以傳遞一個有效的路徑。

#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 開啟一個由名字指定的目錄,並返回它的指標,它是 DIR*

readdirDIR*引數進行操作,並返回一個名為 dirent 的特殊結構(見完整資訊)。

一旦我們把 readdir 呼叫放在 while 迴圈中,與 nullptr 比較,它就像一個目錄迭代器一樣,我們可以通過每個返回的 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;
}
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 創辦人。Jinku 在機器人和汽車行業工作了8多年。他在自動測試、遠端測試及從耐久性測試中創建報告時磨練了自己的程式設計技能。他擁有電氣/ 電子工程背景,但他也擴展了自己的興趣到嵌入式電子、嵌入式程式設計以及前端和後端程式設計。

LinkedIn Facebook

相關文章 - C++ File