readdir,opendir
-
Wutz schrieb:
if( (buffer.st_mode & S_IFMT) == S_IFDIR ) puts("ist Verzeichnis"); else puts("ist Datei");
Irgendwie stimmt das nicht ganz, denn ich bekomme auch bei Verzeichnissen die meldung dass es eine Datei ist.
-
Schau dir mal an, was die Flags im genauen bedeuten. Vielleicht ist dein vermeintliches Verzeichnis nur ein Link.
-
bunower schrieb:
off_t st_size; /* total size, in bytes */
ich sehe hier dass off_t mir nützlich sein kann, aber wie bentuze ich das?
Nein, das hast Du falsch gelesen.
off_t
ist nur der Datentyp vonst_size
. Und letzteres kannst Du einfach auslesen.
-
Habt ihr vielleicht eine andere Idee wie man die aufgabe lösen könnte?
Mein Code sieht so aus bis Jetzt:#include <iostream> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <fcntl.h> using namespace std; int main(int argc, char *argv[]) { DIR *verzeichnis; struct dirent *files; struct stat buffer; verzeichnis=opendir(argv[1]); while(files = readdir(verzeichnis)){ if((buffer.st_mode & S_IFMT) == S_IFDIR ){ cout<<files->d_name<<" //Verzeichnis "<<endl; }else cout<<files->d_name<<" //Datei "<<endl; } closedir(verzeichnis); }
-
Btw, in der Manpage von man: fstat(2) ist ein recht ausführliches Beispiel, probier das mal aus und melde Dich, wenn Du da Verständnisprobleme hast.
-
nman schrieb:
bunower schrieb:
off_t st_size; /* total size, in bytes */
ich sehe hier dass off_t mir nützlich sein kann, aber wie bentuze ich das?
Nein, das hast Du falsch gelesen.
off_t
ist nur der Datentyp vonst_size
. Und letzteres kannst Du einfach auslesen.Gut danke stimmt, kann ich denn off_t in int umwandeln?
-
nman schrieb:
Btw, in der Manpage von man: fstat(2) ist ein recht ausführliches Beispiel, probier das mal aus und melde Dich, wenn Du da Verständnisprobleme hast.
Sehr schön ich beschäftige mich mal damit ein bisschen.
Aber ich verstehe jetzt schon die ganzen Makros nicht.
Ist zwar erklärt aber schlau werde ich dennoch nicht.
z.B: **S_IFMT beschreibung:mask for file type SCO out-of-service inode; BSD unknown type; SVID-v2 and XPG2 have both 0 and 0100000 for ordinary file
**
Ich weiss dass I-node die ganze infos von einer datei enthält
und was hat die Protection für eine aussage über eine Datei?
wieso wird ausgerechnet damit geswitcht?
-
bunower schrieb:
Gut danke stimmt, kann ich denn off_t in int umwandeln?
Ja, aber da läufst Du Gefahr, falsche Ergebnisse zu bekommen.
Sicher sind IIRC nur unsigned long und long long (C99).
Zu Deinen Schwierigkeiten mit dem switch:
S_IFMT 0170000 bit mask for the file type bit fields
Das wird eben als Bitmaske verwendet um an die Dateityp-Bitfelder heranzukommen.
Aber in der Manpage sind ja auch die Makros dokumentiert, es wäre ohnehin klüger, S_ISDIR und Konsorten zu benutzen.
-
Ich habe hier etwas anderes gefunden.
Was ist denn mit dem dirent d_types?
gibt es auch nicht aus ob es eine datei bzw. ein verzeichnis ist?
Ich habe es mal ausgetestet, da d_types vom typ her char ist habe ich es in int umgewandelt und immer wenn es ein Verzeichnis war gibt d_types eine 4 und bei einer Datei eine 8.
kann man denn damit arbeiten?
-
So ich habe schon ein Teil des Programms zu ende Programmiert.
Und zwar wird von einem als Argument übergebenem verzeichnis aus alle Unter verzeichnisse rekursiv durch sucht.
Nun habe ich ein Problem und zwar werden /.. und /. als unterverzeichnisse angenommen und deshalb wird die rekursion endlos.
Mein Programm ist folgendes:#include <iostream> #include <sys/types.h> #include <dirent.h> #include <sys/stat.h> #include <string.h> using namespace std; void rekstat(char* name){ DIR *verzeichnis; struct dirent *files; verzeichnis=opendir(name); struct stat buffer; //rückgabe von d_type ist char und falls man es in int konvertiert und die rückgabe 4 ist, iste es ein verzeichnis //falls 8 dann eine Datei while(files = readdir(verzeichnis)){ if((files->d_type&DT_DIR)){//verzeichnis char* tmp="/"; strcat(name,tmp); strcat(name,files->d_name); //rekstat(name); }else{//datei cout<<files->d_name; cout<<" Datei "<<endl; stat(files->d_name,&buffer); cout<<(long long )buffer.st_size<<endl; } } closedir(verzeichnis); } int main(int argc, char *argv[]) { rekstat(argv[1]); return 0; }