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
* Facepalm * Genau richtig, danke. – ench
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
Klicken Sie auf die Schaltfläche "Frage stellen", um diese Frage zu stellen. –