如何在 C++ 中獲取目錄中的檔案列表
Jinku Hu
2023年10月12日
-
使用
std::filesystem::directory_iterator
來獲取目錄中的檔案列表 -
使用
opendir/readdir
函式獲取目錄中的檔案列表 -
使用
std::filesystem::recursive_directory_iterator
來獲取所有子目錄中的檔案列表
在本文中,我們將介紹在 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*
。
readdir
對 DIR*
引數進行操作,並返回一個名為 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;
}
請注意,由於 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;
}
作者: Jinku Hu