Ich habe ein Programmierproblem, dass ich hoffe, dass jemand da draußen kann mir helfen. Ich versuche C-Programmierung für eine Aufgabe bei der Arbeit zu lernen, und ich habe mir ein kleines Projekt gesetzt, das darin besteht, einen Dateibaum mit allen Unterverzeichnissen zu lesen, die Informationen über jede Datei erhalten.Überprüfung der Verzeichnispfade endet mit ".", ".."
Das Problem, das ich bekomme, ist, dass mein Programm ignoriert den Verzeichnispfad endet entweder mit /. oder/.. und wenn es alle Verzeichnisse druckt, möchte ich Platz vor den Unterverzeichnissen für die Lesbarkeit geben.
so wird der Fehler in diesem Teil aufgetreten:
int isDir(const char *parent, char *name) {
struct stat st_buf; // file info
char buf[BUF_SIZE];
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0) {
return 0;
}
char *path = malloc(strlen(name) + strlen(parent) + 2);
//sprintf(char *buf, const char *format, [arg1],[arg2],...)
sprintf(path, "%s/%s", parent, name);
stat(path, &st_buf); //
return S_ISDIR(st_buf.st_mode); //directory
}
Und das ist Haupt-und Listenfunktion:
int list(const char *name) {
DIR *dirp = opendir(name);
struct dirent *dentry;
char buf[BUF_SIZE];
while ((dentry = readdir(dirp)) != NULL) {
char *dir_name = dentry->d_name;
printf(" %s\n", dir_name);
//if it's dir, then go into dir
if (isDir(name, dir_name)) { //name : parent, dir_name : child
chdir(dir_name);
getcwd(buf, BUF_SIZE);
list(buf);
}
}
closedir(dirp);
}
int main()
{
list(".");
return 0;
}
Das Ergebnis ist wie folgt aus:
hm1.c Data lab1.txt result1 lab3.txt . .. . .. result2 lab3.txt . .. result3 lab3.txt . .. a.c . .. a.out
Ergebnis ich wan t drucken
hm1.c Data lab1.txt result1 lab3.txt result2 lab3.txt result3 lab3.txt a.c a.out
Ihre 'isDir()' Funktion löscht den Speicher jedes Mal, wenn sie mit einem anderen Namen als '.' oder' ..' in 'name' aufgerufen wird. Sie sollten auch 'malloc()' und 'opendir()' mindestens prüfen - wohl auch 'chdir()' und 'getcwd()'. –
Bevor Sie etwas drucken, benötigen Sie eine zusätzliche Überprüfung für '.' und' ..', und Sie werden wahrscheinlich einen zusätzlichen Tiefenparameter an 'list' übergeben wollen, damit Sie darauf einen Einzug erstellen können. –
Wo ist 'dir_name' in' printf ("% s \ n", dir_name); 'definiert, gesetzt, etc? Die Variablen 'file_mode' und' my_passwd' werden ebenfalls nicht verwendet. Bitte beachten Sie die Richtlinien zur Erstellung eines MCVE ([MCVE]). Sie erleichtern es den Menschen, Ihnen zu helfen.Ihr Code scheint von Ihrem Original reduziert zu sein, aber nicht minimiert und nicht überprüfbar. –