Rekursions und Datei Problem
-
Hi Leute, bin erst neu hier und hab leider noch nix passendes gefunden.
Mein Problem:
Ich wollte eine Funktion schreiben die rekursiv, ausgehend von meinem Ausgangsverzeichnis, alle Ordner durchsucht und die Dateinamen am Bildshcirm ausgibt. Das ganze ist noch mit einer Dateiendungsprüfung verknüpft, welche aber in diesem Beispiel ausser acht gelassen werden kann, hat damit absolut nichts zu tun.
Hier der Code der Funktion:
void Verzeichnis(string Dirname) { DIR *hdir; struct dirent *entry; string TempFile, TempInfo; string TempExt; int TempInt; hdir = opendir(Dirname.c_str()); do { entry = readdir(hdir); if (entry) { TempFile = entry->d_name; TempExt = DateiErweiterung(TempFile); if ((TempFile != ".") and (TempFile != "..")) { if (opendir(entry->d_name) == NULL) { cout << Dirname << "/" << TempFile << "\n"; } else { Verzeichnis(Dirname+"/"+TempFile); } } } } while (entry); closedir(hdir); }
(ich hoffe der Syntaxsytle ist einigermaßen so akzeptabel).
Da ich erst heute mit C++ angefangen habe kann ich nicht wirklich viel dazu sagen (programmiere aber schon seit 2 Jahren Delphi, von demher weiß ich schon was für einen Algo ich da schreibe
).
Ich vermute das Problem liegt an den Zeiger, ganz oben in der Funktion, aber wie sehr cih mein kleines Hirn auch anstrenge ich kann mir nicht denken wo das Problem liegt.
Wenn jemand hier nenn Rat kennt, wäre ich seeeeehr dankbar!
Gruß Tobi
-
*Kristallkugel anwirft* verdammt, immer noch kaputt, also anders: Was genau hat denn dieser Zeiger für ein Problem?
(btw solltest du das in der if-Abfrage geöffnete Verzeichnis auch irgendwo wieder schließen ;))
-
HI
Ich habe doch geschrieben das ich nur vermute das der Zeiger Probleme machen könnte, nicht aber das ich es weiß!
Ich hatte gehofft hier weiß einer wo das Problem liegt.
Das Verzeichnis öffne ich ja nicht in der If Abfrage, das wird vor der Schleife geöffnet und nach der Schleife wieder geschlossen.
Da das ganze rekursiv abläuft müsste es auch immer das geöffnete Verzeichnis wieder schließen.
Das Programm funktioniert auch einwandfrei, nur das es eben nicht funktioniert wenn 2 Verzeichnisse in einem Unterverzeichnis, bzw. im Ausgangsverzeichnis sind.
Wenn du, bzw. irgendjemand mehr Informationen rbaucht um mir zu helfen nur schreiben, ich sag zurnot auch die Maße meiner Freundin wenn die weiterhelfen
Gruß Tobi
-
Sodelle nach einigen Recherchen habe ich jetzt herrausgefunden das diese Funktion:
void Verzeichnis(string Dirname) { DIR * hdir; struct dirent * entry; string TempFile, TempInfo; string TempExt; int TempInt; hdir = opendir(Dirname.c_str()); do { entry = readdir(hdir); if (entry) { TempFile = entry->d_name; TempExt = DateiErweiterung(TempFile); if ((TempFile != ".") and (TempFile != "..")) { if (opendir(entry->d_name) == NULL) { if (UnerlaubteErweiterung(TempExt) == true) { cout << Dirname << "/" <<TempFile << " : ist nicht erlaubt\n"; AusgabeDatei << Dirname << "/" <<TempFile << "\n"; } else { cout << Dirname << "/" << TempFile << " : ist erlaubt\n"; } } else { Verzeichnis(Dirname+"/"+TempFile); } } } } while (entry); closedir(hdir); }
So arbeitet wie ich will, allerdings nicht wenn ein Leerzeichen in einem Verzeichnisnamen ist! Wie kann ich das Problem lösen?
Gruß Tobi
-
ttobsen schrieb:
Das Verzeichnis öffne ich ja nicht in der If Abfrage, das wird vor der Schleife geöffnet und nach der Schleife wieder geschlossen.
Du hast in deiner Funktion zwei opendir() Aufrufe. Zum ersten gibt es am Ende auch einen passenden closedir(), allerdings der zweite Aufruf ("if(opendir(entry->d_name) == NULL) ...") wird nicht wieder geschlossen - da sammeln sich im Lauf der Zeit ungenutzte Directory-Handles an.
Was die Leerzeichen im Namen angeht - helfen dir dort die DOS-Namen (8.3 Sytem) weiter?
-
ok
Das ganze arbeitet nun so wie ich mag! AHbe das ganze auch etwas verfeinert und arbeite nun mit stat um zu prüfen ob ein Verzeichnis existiert.
void Verzeichnis(string Dirname, ofstream &AusgabeDatei) { DIR * hdir; struct dirent * entry; struct stat Status; string TempFile, TempInfo, TempExt, strPath; int Dateityp; //S_IFREG = NOrmale Datei; S_IFDIR = Verzeichnis hdir = opendir(Dirname.c_str()); do { entry = readdir(hdir); if (entry) { TempFile = entry->d_name; TempExt = DateiErweiterung(TempFile); strPath = Dirname + "/" + TempFile; if ((TempFile != ".") and (TempFile != "..")) { stat(strPath.c_str(), &Status); Dateityp = Status.st_mode & S_IFMT; if (Dateityp != S_IFDIR) { if (UnerlaubteErweiterung(TempExt) == true) { cout << Dirname << "/" << TempFile << " : ist nicht erlaubt\n"; AusgabeDatei << Dirname << "/" << TempFile << "\n"; } else { cout << Dirname << "/" << TempFile << " : ist erlaubt\n"; } } else { Verzeichnis(Dirname+"/"+TempFile, AusgabeDatei); } } } } while (entry); closedir(hdir); }
Vielen DAnk für eure Hilfe, sonst würde ich jetzt nochd ran sitzen
Gruß Tobi