2012-04-06 152 views
1

我一直在嘗試在c中編寫迭代目錄。我從一個標準的遞歸目錄遍歷開始,它按預期工作。現在我試圖使用隊列結構將其轉換爲迭代版本,但它的行爲意外。不知何故,子目錄中的一個文件正在被添加到我的隊列中,並且當試圖將文件作爲目錄打開時,程序明顯失敗。c中的迭代目錄遍歷

代碼段

char *dirName; 
DIR *dp; 
struct dirent *d_ent; 
struct stat s; 
char name[80]; 

... 

while(!IsEmpty(q)){ 
    dirName = FrontAndDequeue(q); 
    if((dp = opendir(dirName)) == NULL) { 
     printf("ERROR: dirRec: %s: %s\n", dirName, strerror(errno)); 
    } else { 
     while((d_ent = readdir(dp)) != NULL) { 
      if((strcmp(d_ent->d_name, "..") != 0) && (strcmp(d_ent->d_name, ".") != 0)){ 
       strcpy(name, dirName); 
       strcat(name, "/"); 
       strcat(name, d_ent->d_name); 
       if(lstat(name, &s) < 0) { 
        printf("ERROR: dirDepth: %s: %s\n", name, strerror(errno)); 
       } else { 
        if(S_ISDIR(s.st_mode)) {  /* Process directories. */ 
         printf("Directory : %s\n", name); 
         Enqueue(name, q); 
        } else {    /* Process non-directories. */ 
         printf("File  : %s\n", name); 
        } 
       } 
      } 
     } 
     closedir(dp); 

樣品試驗

$ ./dir . 
File  : ./dir.c 
File  : ./dir.cpp 
File  : ./dir.exe 
File  : ./dir.exe.stackdump 
File  : ./dirRec.c 
File  : ./dirRec.exe 
File  : ./fatal.h 
File  : ./Makefile 
File  : ./queue.c 
File  : ./queue.h 
File  : ./stackli.c 
File  : ./stackli.h 
Directory : ./testL1a 
Directory : ./testL1b 
File  : ./testL1b/New Bitmap Image.bmp 
ERROR: dirRec: ./testL1b/New Bitmap Image.bmp: Not a directory 

回答

2

我們什麼也看不見排隊()不會,但你把一個字符串指針的隊列,而不是機率高字符串的副本。所以是的,因爲您在while循環中修改名稱,所以您退出的內容不會再次是相同的字符串。

+0

* Facepalm *沒錯,謝謝。 – ench 2012-04-06 19:15:10

+0

這引出了另一個問題,將字符串複製到隊列中的最佳方法是什麼(我已切換到C++和STL ::隊列)。 – ench 2012-04-06 20:16:54

+0

點擊「提問」按鈕來提問。 – 2012-04-06 20:17:31