首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言遞迴遍歷目錄與檔案完整實作

     編輯:關於C語言

程式功能

使用 POSIX dirent.h 介面,遞迴掃描指定目錄下的所有子目錄與一般檔案,並統計總數。支援任意深度目錄樹,動態分配路徑緩衝區。

核心資料結構與常數

#define MAX_PATH_LENGTH 512
#define MAX_FILE_EXTENSION 9

unsigned long visit_dirs = 0;
unsigned long visit_files = 0;

遞迴遍歷函式 listdir

void listdir(char *path) {
    DIR *ptr_dir;
    struct dirent *dir_entry;
    char *child_path = malloc(MAX_PATH_LENGTH);
    char *file_path = malloc(MAX_PATH_LENGTH);
    // ... 錯誤檢查與初始化 ...

    ptr_dir = opendir(path);
    while ((dir_entry = readdir(ptr_dir)) != NULL) {
        // 目錄項目:略過 . 和 ..
        if (dir_entry->d_type & DT_DIR) {
            if (strcmp(dir_entry->d_name, ".") == 0 || strcmp(dir_entry->d_name, "..") == 0) continue;
            sprintf(child_path, "%s/%s", path, dir_entry->d_name);
            printf("[DIR]%s\n", child_path);
            visit_dirs++;
            listdir(child_path);  // 遞迴
        }
        // 一般檔案
        if (dir_entry->d_type & DT_REG) {
            sprintf(file_path, "%s/%s", path, dir_entry->d_name);
            printf("[FILE]%s\n", file_path);
            visit_files++;
        }
    }
    free(child_path);
    free(file_path);
}

關鍵技術點

  • 動態記憶體管理:每層遞迴獨立分配/釋放路徑緩衝區,避免併發衝突與記憶體洩漏。
  • d_type 欄位判斷:利用 DT_DIR、DT_REG 快速區分類型,免去額外 stat() 系統呼叫 (視檔案系統支援度)。
  • 路徑拼接:使用 sprintf 組合完整路徑,注意緩衝區大小邊界。

主程式進入點

int main(int argc, char* argv[]) {
    if (argc == 2) {
        listdir(argv[1]);
        printf("Total DIR: %ld, Total FILE: %ld\n", visit_dirs, visit_files);
    } else {
        printf("Usage: listdir <dir>\n");
    }
    return 0;
}

編譯與執行

gcc listdir.c -o listdir
./listdir /path/to/scan

潛在改進方向

  1. 使用 fts(3) 或 nftw(3) 更健壯的樹遍歷 API。
  2. 加入符號連結 (DT_LNK) 處理,避免循環掛載導致無限遞迴。
  3. 支援檔案擴展名過濾 (對應 MAX_FILE_EXTENSION 預留)。
  4. 錯誤處理區分 errno 碼,提供更友善訊息。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved