[erledigt] Festplatte, struktur auslesen
-
hi,
ich versuche derzeit die Verzeichnisstruktur auszulesen und nach dem schema
order
-datei
-datei
-unterordner1
--unterordner1_datei
--unterordner1_datei
-datei
-datei
(usw.)ausgeben zu lassen.
bedauerlicherweise geht er nur durch einen zweig des baums:
-NEWS -debug --config.log --libtool --config.h --stamp-h1 --src ---.libsan dieser stelle stellt er fest das .libs leer ist und müsste den restlichen inhalt von -debug ausgeben, tut er aber nicht.
google und co. konnten mir nicht weiterhelfen, lediglich das auslesen einzelnder verzeichnisse lässt sich dort finden, auch die boardsuche hat mir nicht helfen können.
auch das durchwühlen von referenzen hat mich nicht weitergebracht und ich nähre mich langsam der verzweifelung an.
Die funktion die die verzeichnisstruktur einließt:
void LaD ( TListenKnoten *handle) { ostringstream likeinput; likeinput << startknoten->mydir; const char* temp = likeinput.str().c_str(); if (chdir(temp)) { perror("Verzeichniswechsel"); } ostringstream likeinput2; likeinput2 << handle->mydir; const char* temp2 = likeinput2.str().c_str(); chdir(temp2); handle->dir=opendir("./"); do { if (dirzeiger = readdir(handle->dir)) { perror("readdir"); } else { perror("readdir"); } if (dirzeiger) { if ((strcmp(dirzeiger->d_name, ".")==0) or (strcmp(dirzeiger->d_name, "..")==0)) { } else { struct stat attribut; if (stat(dirzeiger->d_name, &attribut)) { perror("Fehler bei stat"); cout << errno << endl; } else { neu = new struct TListenKnoten; // Typ des Eintrags ermitteln if( S_ISREG(attribut.st_mode) ) { cout << "Reguläre Datei:\t\t " << dirzeiger->d_name << endl; neu->wert="Reguläre Datei \t\t"; } else if( S_ISDIR(attribut.st_mode) ) { cout << "Verzeichnis:\t\t " << dirzeiger->d_name << endl; neu->wert="Verzeichnis \t\t"; } else if( S_ISCHR(attribut.st_mode) ) { cout << "zeichorient. Gerätedatei:\t\t " << dirzeiger->d_name << endl; neu->wert="zeichorient. Gerätedatei \t\t"; } else if( S_ISBLK(attribut.st_mode) ) { cout << "blockorient. Gerätedatei:\t\t " << dirzeiger->d_name << endl; neu->wert="blockorient. Gerätedatei \t\t"; } else if( S_ISFIFO(attribut.st_mode) ) { cout << "FIFO oder named Pipe:\t\t " << dirzeiger->d_name << endl; neu->wert="FIFO oder named Pipe \t\t"; } else { cout << "Unbekannte Datei:\t\t " << dirzeiger->d_name << endl; neu->wert="Unbekannte Datei \t\t"; } // Neuen eintrag erstellen neu->mydir = dirzeiger->d_name; neu->nodename=dirzeiger->d_name; neu->lastelement=handle; handle->nextelement.push_back(*neu); if (S_ISDIR(attribut.st_mode)) { // temp und temp2 werden nicht korrekt behandelt, liste geht nur durch ersten zweig. LaD (&handle->nextelement[handle->nextelement.size()-1]); } } } } } while (dirzeiger); }ich habe eig. nurnoch eine mögliche erklärung dafür, das das aktuelle opendir das vorrangegangene überschreibt, aber ansonsten bin ich ratlos.
-
Wozu das Rad zweimal erfinden - soetwas gibt es schon
-
hartmut1164 schrieb:
Wozu das Rad zweimal erfinden - soetwas gibt es schon
nunja, hast durchaus recht, allerdings lernt man dadurch ja nichts^^
PS: die ausgabe erfolgt über eine andere funktion
edit::
Problem gelöst:
if (S_ISDIR(attribut.st_mode)) { LaD (&handle->nextelement[handle->nextelement.size()-1]); chdir(".."); }ich habe mir einfach mal den absoluten pfad des arbeitsverzeichnisses an mehreren programmstellen ausgeben lassen und siehe da, das aktuelle arbeitsverzeichnis ist global...