2012-04-06 9 views
1

Ich habe versucht, ein iteratives Verzeichnis in c zu schreiben. Ich begann mit einem standardmäßigen rekursiven Verzeichnis-Traversal, das wie erwartet funktioniert. Jetzt versuche ich dies in eine iterative Version mit einer Queuestruktur zu konvertieren, aber es verhält sich unerwartet. Irgendwie wird eine Datei im Unterverzeichnis meiner Warteschlange hinzugefügt, und das Programm schlägt offensichtlich fehl, wenn ich versuche, eine Datei als Verzeichnis zu öffnen.Iteratives Verzeichnis Traversal in c

Code Snippet

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); 

Sample Run

$ ./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 

Antwort

2

Wir können nicht sehen, was Enqueue() tut, aber Chancen sind hoch Sie einen Zeiger auf eine Zeichenfolge in die Warteschlange stellen statt eine Kopie der Zeichenfolge. Also ja, was Sie aus der Warteschlange entfernen wird nicht wieder die gleiche Zeichenfolge sein, da Sie Name in der While-Schleife ändern.

+0

* Facepalm * Genau richtig, danke. – ench

+0

Das wirft eine andere Frage auf, wie die Zeichenfolge am besten in eine Warteschlange kopiert wird (ich habe zu C++ und der STL :: -Schlange gewechselt). – ench

+0

Klicken Sie auf die Schaltfläche "Frage stellen", um diese Frage zu stellen. –