2011-10-02 70 views
0

這個程序是打印在根級別印刷全部採用C++

Directory_1 
Directory_2 

的目錄,但我希望能夠在其中打印目錄太

Directory_1 
    Directory_1_2 
    Directory_1_3 
Directory_2 
    Directory 2_1 
     Directory_2_1_1 
Directory_4 

我試圖目錄做遞歸,但我發現很難通過Directory_1作爲根,因此得到評估..我錯過了什麼?

這裏是我的輸出

.. 
. 
Directory_1 
Directory_2 
Failed to open directory: No such file or directory 

代碼

#include <dirent.h> 
#include <errno.h> 
#include <stdio.h> 
#include <sys/stat.h> 

char *arg_temp; 

int printDepthFirst(char *arg_tmp); 

int main(int argc, char *argv[]) { 

    if (argc != 2) { 
     fprintf(stderr, "Usage: %s directory_name\n", argv[0]); 
     return 1; 
    } 


    arg_temp = argv[1]; 

    printDepthFirst(arg_temp); 

} 

int printDepthFirst(char *arg_tmp) 
{ 

    struct dirent *direntp; 
    DIR *dirp; 

    if ((dirp = opendir(arg_tmp)) == NULL) { 
     perror ("Failed to open directory"); 
     return 1; 
    } 


    while ((direntp = readdir(dirp)) != NULL) 
    { 
    printf("%s\n", direntp->d_name); 
    arg_tmp = direntp->d_name; 
    }  
    printDepthFirst(arg_tmp); 

    while ((closedir(dirp) == -1) && (errno == EINTR)) ; 
    return 0; 

} 

現在,我知道問,他們認爲我期待他們能夠編寫這個問題時,有些人感到惱火,你不需要,如果你可以告訴我理論上我需要做什麼..我會研究它,但如果它的一個小程序修復,你可以發佈,我真的appreaciate它..但如果不是..我也很想聽聽有什麼需要要用文字完成。

謝謝

+3

人們感到惱火,因爲你沒有花太多的時間去自己解決的事情。你得到'沒有這樣的目錄',那麼你做了什麼來調試呢?你打印出了要打開的目錄名稱嗎?它是否與當前目錄中的名稱相對應?如果不是,你認爲你可以做些什麼來使它工作? (並且在你的網站上有目錄遍歷的例子。) – Mat

+0

嗯我已經花了很長一段時間,你的假設是不正確的..你不能在不知道的情況下就在飛行中進行判斷..我嘗試過不同的事情。 。是的,我嘗試了上述所有內容,並在我的文章中提到了錯誤 – user975582

+0

您需要花更多時間思考您的代碼並學習調試它。您發佈的代碼沒有單獨的「調試」打印輸出,因此根本不清楚您明白髮生了什麼。如果您在代碼運行時打印出來的東西,或者使用調試器,您會更好地感受代碼的實際工作方式,並且您將瞭解需要做什麼來修復它。但是你真的需要去思考你的code_,並且通過在每一步中儘可能多地調試信息來幫助你自己。 – Mat

回答

2

嗯,這應有助於:

#define _XOPEN_SOURCE 500 
#include <ftw.h> 
#include <stdio.h> 

static int display_info(const char *fpath, const struct stat *sb, 
      int tflag, struct FTW *ftwbuf) 
{ 
    switch(tflag) 
    { 
     case FTW_D: 
     case FTW_DP: puts(fpath); break; 
    } 
    return 0; /* To tell nftw() to continue */ 
} 

int main(int argc, char *argv[]) 
{ 
    if (argc != 2) { 
     fprintf(stderr, "Usage: %s directory_name\n", argv[0]); 
     return 1; 
    } 

    int flags = FTW_DEPTH | FTW_MOUNT | FTW_PHYS; 

    if (nftw(argv[1], display_info, 20, flags) == -1) 
    { 
     perror("nftw"); 
     return 255; 
    } 

    return 0; 
} 
+0

哇這個作品真的不錯 – user975582

+0

@ user975582:點的情況下:重新使用代碼,不要重新發明輪子:) – sehe

+0

我不知道關於nftw(),謝謝:) – Septagram

1

看看struct dirent包含哪些字段。

1

字符串dirent :: d_name是一個目錄的名稱,而不是完整路徑。因此,如果您的目錄「C:\ Alpha」包含目錄「C:\ Alpha \ Beta」,則d_name只會包含「Beta」,而不是「C:\ Alpha \ Beta」。你將不得不組裝的完整路徑自己 - 附加斜線/反斜線您arg_tmp,然後追加新的目錄名,像這樣:

while ((direntp = readdir (dirp)) != NULL) 
{ 
    char *dirname = direntp->d_name; 

    // Only work with directories and avoid recursion on "." and "..": 
    if (direntp->d_type != DT_DIR || !strcmp (dirname, ".") || !strcmp (dirname, "..")) continue; 

    // Assemble full directory path: 
    char current [strlen (arg_tmp) + 2 + strlen (dirname)]; 
    strcpy (current, arg_tmp); 
    strcat (current, "\\"); // Replace "\\" with "/" on *nix systems 
    strcat (current, dirname); 

    // Show it and continue: 
    printf ("%s\n", current); 
    printDepthFirst (current); 
} 

此外,你應該遞歸調用內循環,不在外面。

+0

聽起來不錯,我應該導入什麼庫或標題使用strcpy,strcat? – user975582

+0

@ user975582:#include Septagram

0

裏面你while循環內printDepthFirst你可能需要類似:

if(direntp->d_type == DT_DIR) 
    printDepthFirst(directp->d_name); 

你也許對這擔心..目錄了。

另外,我發現boost :: filesystem工作得很好。