2012-02-23 102 views
0

我正在寫一個C程序來遍歷文件系統樹。我知道ftw(),但想自己做。問題是我希望我的C程序能夠訪問每個節點(目錄/文件),而不必爲每個節點執行pathlookup(當然,但是也希望避免這種情況)。文件系統樹遍歷

感謝

假設一個目錄有兩個孩子,B和C.我的方式,以達到每個B和C是讀他的C含量和訪問B和C與路徑/ A/B和/ A /C。但想從參考與訪問B和C出來的路徑,並直接在

+1

那麼你的問題到底是什麼呢? – noMAD 2012-02-23 17:27:09

+0

我想我在這裏得到了我的答案http://stackoverflow.com/questions/7035733/unix-c-program-to-list-directories-recursively在這一行「或者,你可以chdir進入目錄,當你輸入它們和然後當你完成後chdir備份「 – 2012-02-23 17:43:11

回答

2

就可避免重複路徑查找和醜陋(全局狀態和非線程安全性)chdir通過使用openatfdopendir而不是opendir遍歷樹。

1

這裏:

#include <unistd.h> 
#include <stdio.h> 
#include <dirent.h> 
#include <string.h> 
#include <sys/stat.h> 

void printdir(char *dir, int depth) 
{ 
    DIR *dp; 
    struct dirent *entry; 
    struct stat statbuf; 
    int spaces = depth*4; 

    if((dp = opendir(dir)) == NULL) { 
     fprintf(stderr,"cannot open directory: %s\n", dir); 
     return; 
    } 
    chdir(dir); 
    while((entry = readdir(dp)) != NULL) { 
     lstat(entry->d_name,&statbuf); 
     if(S_ISDIR(statbuf.st_mode)) { 
      /* Found a directory, but ignore . and .. */ 
      if(strcmp(".",entry->d_name) == 0 || 
       strcmp("..",entry->d_name) == 0) 
       continue; 
      printf("%*s%s/\n",spaces,"",entry->d_name); 
      /* Recurse at a new indent level */ 
      printdir(entry->d_name,depth+1); 
     } 
     else printf("%*s%s\n",spaces,"",entry->d_name); 
    } 
    chdir(".."); 
    closedir(dp); 
} 

/* Now we move onto the main function. */ 

int main(int argc, char* argv[]) 
{ 
    char *topdir, pwd[2]="."; 
    if (argc != 2) 
     topdir=pwd; 
    else 
     topdir=argv[1]; 

    printf("Directory scan of %s\n",topdir); 
    printdir(topdir,0); 
    printf("done.\n"); 

    return 0; 
} 

Link to the original paper