2016-11-02 210 views
1

我的目標是打印目錄及其子目錄內的所有文件。如果路徑是一個文件,我打印出路徑。但是,如果路徑是目錄,那麼我遞歸地調用pathInfo(pathnm),其中pathnm是路徑。我的推理是,它最終會到達最後一個目錄,在這種情況下,它將打印該目錄中的所有文件。隨着它朝着最後一個目錄前進,它會連續打印遇到的文件。最終,打印給定路徑目錄及其子目錄中的所有文件。打印目錄及其子目錄中的所有文件

問題是在運行時,程序無法打印文件名。相反,它會打印連續的垃圾線,如/Users/User1//././././././././././././。直到程序退出並出現錯誤progname: Too many open files

如果我錯誤地做了什麼以及如何修復它,以便程序以我描述的方式運行,我將不勝感激。請以對新編程人員清楚的方式來組織您的答案。

謝謝。

PATHINFO功能

#include "cfind.h" 

void getInfo(char *pathnm, char *argv[]) 
{ 
    DIR *dirStream; // pointer to a directory stream 
    struct dirent *dp; // pointer to a dirent structure 
    char *dirContent = NULL; // the contents of the directory 
    dirStream = opendir(pathnm); // assign to dirStream the address of pathnm 
    if (dirStream == NULL) 
    { 
     perror(argv[0]); 
     exit(EXIT_FAILURE); 
    } 
    while ((dp = readdir(dirStream)) != NULL) // while readdir() has not reached the end of the directory stream 
    { 
     struct stat statInfo; // variable to contain information about the path 
     asprintf(&dirContent, "%s/%s", pathnm, dp->d_name); // writes the content of the directory to dirContent // asprintf() dynamically allocates memory 
     fprintf(stdout, "%s\n", dirContent); 
     if (stat(dirContent, &statInfo) != 0) // if getting file or directory information failed 
     { 
      perror(pathnm); 
      exit(EXIT_FAILURE); 
     } 
     else if (aflag == true) // if the option -a was given 
     { 
      if (S_ISDIR(statInfo.st_mode)) // if the path is a directory, recursively call getInfo() 
      { 
       getInfo(dirContent, &argv[0]); 
      } 
      else if(S_ISREG(statInfo.st_mode)) // if the path is a file, print all contents 
      { 
       fprintf(stdout, "%s\n", dirContent); 
      } 
      else continue; 
     } 
     free(dirContent); 
    } 
    closedir(dirStream); 
} 
+1

它的時間來學習如何使用調試器。 –

+0

它實際上是過去的時間。 –

回答

4

每個目錄包含條目 「」這指向自己。 您必須確保跳過此條目(還有指向父目錄的「..」條目)。

因此,對於你的榜樣,增加額外的條件,行

if (S_ISDIR(statInfo.st_mode)) 
+0

謝謝。你有什麼建議,我應該如何去做這件事? –

+2

使用strcmp()作爲目錄名稱,以確保該名稱既不是「。」。也不是「..」 – neuhaus

+1

非常好。非常感謝您的幫助。 –

相關問題