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 von st_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 von st_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;
    }
    

Anmelden zum Antworten