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

Jinku Hu 2023年1月30日 2020年10月15日
  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 <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 開啟一個由名字指定的目錄,並返回它的指標,它是 DIR*

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

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

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ File