dirent.h)#include <dirent.h>
#include <stdio.h>
int main(void) {
DIR *dp = opendir("/");
if (!dp) { perror("opendir"); return 1; }
struct dirent *ep;
while ((ep = readdir(dp))) {
if (strcmp(ep->d_name, ".") == 0 || strcmp(ep->d_name, "..") == 0) continue;
printf("type=%d, name=%s\n", ep->d_type, ep->d_name);
}
closedir(dp);
return 0;
}
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void walk(const char *path) {
struct dirent **list;
int n = scandir(path, &list, NULL, alphasort);
if (n < 0) { perror("scandir"); return; }
for (int i = 0; i < n; ++i) {
if (strcmp(list[i]->d_name, ".") == 0 || strcmp(list[i]->d_name, "..") == 0) {
free(list[i]); continue;
}
char full[PATH_MAX];
snprintf(full, sizeof(full), "%s/%s", path, list[i]->d_name);
puts(full);
if (list[i]->d_type == DT_DIR) // 是目錄
walk(full); // 遞迴
free(list[i]);
}
free(list);
}
int main(void) { walk("/home/user"); return 0; }
nftw() (File Tree Walk) — 更健壯#include <ftw.h>
#include <stdio.h>
int callback(const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf) {
printf("%*s%s\n", ftwbuf->level * 2, "", fpath);
return 0; // 繼續遍歷
}
int main(void) {
nftw("/home/user", callback, 20, FTW_PHYS); // 20 = 最大開啟檔案描述符數
return 0;
}
優點:自動處理符號連結循環 (FTW_PHYS)、深度優先/廣度優先可控、標準化錯誤處理。
std::filesystem (現代、跨平台)#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
for (auto &entry : fs::recursive_directory_iterator("/home/user")) {
std::cout << entry.path() << '\n';
}
return 0;
}
支援 Windows/Linux/macOS,自動處理編碼、權限錯誤、迴路偵測。
QDirIterator (專案已用 Qt 時)QDirIterator it("/home/user", QDir::AllEntries | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
while (it.hasNext()) {
qDebug() << it.next();
}
# 完整路徑
find /home/user -type f
# 僅檔名
ls -R /home/user
| 方法 | 標準 | 遞迴支援 | 符號連結處理 | 錯誤處理 | 適用場景 |
|---|---|---|---|---|---|
| opendir/readdir | POSIX | 手寫遞迴 | 需自行檢查 | 手動 | 教學、極簡環境 |
| scandir | POSIX | 手寫遞迴 | 需自行檢查 | 手動 | 需排序、過濾 |
| nftw | POSIX.1-2008 | 內建 | FTW_PHYS/FTW_DEPTH | 回呼回傳值控制 | 系統程式、備份工具 |
| std::filesystem | C++17 | 內建 | 自動偵測迴路 | 例外機制 | 現代 C++ 專案 |
| Qt QDirIterator | Qt | 內建 | 自動 | 信號/槽 | Qt 專案 |
nftw 或 std::filesystem,健壯度最高/proc, /sys, /dev 等虛擬檔案系統深度遍歷(可能掛住)nftw 可限制並發std::filesystem,CMake 需 set(CMAKE_CXX_STANDARD 17)