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

Linux C 遞歸遍歷目錄統計文件類型比例:chdir + readdir 高效實現

     編輯:關於C語言

Linux C 遞歸遍歷目錄統計文件類型比例:chdir + readdir 高效實現

參考《UNIX 環境高級編程》課後題 4.11,採用 進入子目錄 → 讀取 → 遞歸 → 返回父目錄 策略,避免拼接完整路徑,顯著提升性能。

核心思路

  • chdir(fullpath) 進入目標目錄。
  • opendir(".") 打開當前目錄,readdir 讀取條目。
  • 跳過 . 和 ..。
  • 對每個條目:lstat 獲取類型,更新計數器;若為目錄,遞歸 dopath。
  • 遞歸返回後 chdir("..") 回退。

完整代碼(關鍵片段)

static int dopath(MyFunc *func) {
    struct stat statbuf;
    DIR *dp; struct dirent *dirp;
    if (lstat(fullpath, &statbuf) < 0) return func(fullpath, &statbuf, FTW_NS);
    if (!S_ISDIR(statbuf.st_mode)) return func(fullpath, &statbuf, FTW_F);

    if (func(fullpath, &statbuf, FTW_D) != 0) return -1;
    if (chdir(fullpath) < 0) return -1;

    if (!(dp = opendir("."))) return func(fullpath, &statbuf, FTW_ND);
    while ((dirp = readdir(dp))) {
        if (!strcmp(dirp->d_name, ".") || !strcmp(dirp->d_name, "..")) continue;
        strcpy(fullpath, dirp->d_name);
        if (dopath(func) != 0) break;
    }
    chdir("..");
    closedir(dp);
    return 0;
}

文件類型統計

static long sock_c, lnk_c, reg_c, blk_c, dir_c, chr_c, fifo_c, total_c;

static int myfunc(const char *path, const struct stat *st, int type) {
    switch (type) {
        case FTW_F:
            switch (st->st_mode & S_IFMT) {
                case S_IFSOCK: sock_c++; break;
                case S_IFLNK:  lnk_c++; break;
                case S_IFREG:  reg_c++; break;
                case S_IFBLK:  blk_c++; break;
                case S_IFCHR:  chr_c++; break;
                case S_IFIFO:  fifo_c++; break;
            }
            break;
        case FTW_D: dir_c++; break;
        // FTW_NS, FTW_ND 錯誤處理...
    }
    return 0;
}

運行結果

性能對比

  • chdir 版:僅操作相對路徑,stat 系統調用少,速度提升明顯(圖中 descend_hierarchy_ch 更快)。
  • 完整路徑版:每次拼接完整路徑字符串,stat 開銷大。

關鍵優化點

  1. 避免重複路徑拼接與 strlen/strcpy 開銷。
  2. 利用進程當前工作目錄(CWD)隱式維護路徑上下文。
  3. fullpath 復用單一緩衝區,無頻繁 malloc/free。

此模式適用於深度遍歷、大量文件場景,是 Linux 系統編程中目錄遍歷的高效範式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved