溫馨提示×

如何用readdir實現遞歸目錄遍歷

小樊
66
2025-05-26 21:46:05
欄目: 編程語言

使用 readdir 實現遞歸目錄遍歷通常涉及以下幾個步驟:

  1. 打開目錄:使用 opendir 打開當前目錄。
  2. 讀取目錄內容:使用 readdir 讀取目錄中的每一個條目。
  3. 過濾條目
    • 忽略 ... 這兩個特殊目錄項。
    • 根據需要,可以過濾掉其他非目錄或特定類型的文件。
  4. 處理目錄和文件
    • 如果條目是目錄,則遞歸調用遍歷函數。
    • 如果條目是文件,則進行相應的處理(例如打印文件名)。
  5. 關閉目錄:在完成對一個目錄的處理后,使用 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);
}

代碼說明

  1. 主函數 (main)

    • 檢查命令行參數,確保提供了一個目錄路徑。
    • 調用 recursive_readdir 開始遞歸遍歷。
  2. 遞歸遍歷函數 (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 實現遞歸目錄遍歷,適用于各種需要在程序中處理文件系統的場景。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女