使用 readdir
實現遞歸目錄遍歷通常涉及以下幾個步驟:
opendir
打開當前目錄。readdir
讀取目錄中的每一個條目。.
和 ..
這兩個特殊目錄項。closedir
關閉目錄。下面是一個使用 C 語言實現的遞歸目錄遍歷的示例代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/stat.h>
// 函數聲明
void recursive_readdir(const char *path);
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, "用法: %s <目錄路徑>\n", argv[0]);
return EXIT_FAILURE;
}
const char *start_path = argv[1];
recursive_readdir(start_path);
return EXIT_SUCCESS;
}
void recursive_readdir(const char *path) {
DIR *dir = opendir(path);
if (dir == NULL) {
perror("無法打開目錄");
return;
}
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
// 跳過當前目錄和父目錄
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0)
continue;
// 構建完整的路徑
size_t len = strlen(path) + strlen(entry->d_name) + 2; // +1 for '/' and +1 for '\0'
char full_path[len];
snprintf(full_path, len, "%s/%s", path, entry->d_name);
struct stat st;
if (stat(full_path, &st) == -1) {
perror("無法獲取文件狀態");
continue;
}
if (S_ISDIR(st.st_mode)) {
// 如果是目錄,遞歸遍歷
printf("目錄: %s\n", full_path);
recursive_readdir(full_path);
} else {
// 如果是文件,進行處理(這里以打印文件名為例)
printf("文件: %s\n", full_path);
}
}
closedir(dir);
}
主函數 (main
):
recursive_readdir
開始遞歸遍歷。遞歸遍歷函數 (recursive_readdir
):
opendir
打開指定路徑的目錄。readdir
逐個讀取目錄中的條目。.
和 ..
。snprintf
構建條目的完整路徑。stat
獲取條目的文件狀態。recursive_readdir
。closedir
關閉目錄。將上述代碼保存為 recursive_readdir.c
,然后使用以下命令編譯和運行:
gcc -o recursive_readdir recursive_readdir.c
./recursive_readdir /path/to/directory
替換 /path/to/directory
為你想要遍歷的目標目錄。
S_ISLNK
來避免這種情況。通過以上方法,你可以使用 readdir
實現遞歸目錄遍歷,適用于各種需要在程序中處理文件系統的場景。