kostenloser Webspace werbefrei: lima-city


mit C verzeichnise durcharbeiten

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    b******n

    Hallo ich versuch in C ein Programm zu schrieben, welches Datein auflisten kann..


    Es soll so funktionieren, das ich es in einem Ordner Starte und das Programmm generiert mir eine liste art liste mit allen ordnern und Dateien (und unterordner und unterdateien). Soll so ähnlich werden wie der Befehl 'tree' unter dos. Nur hab ich vor nacher noch n paar schalter etc reinzuprogrammieren.

    jetzt aber zum Problem, ich hab keine Ahnung wie ich mich durch verzeichnisse arbeite.

    in PHP hab ich schonmal sowas ähnmliches aus anderen gründen geschrieben:

    $handle = opendir($dir);
    
    while(false !== ($file = readdir($handle))) {	
    
    	if( $file!="." && $file!=".." )
    	{
    		if (count(explode(".",$file))<2)
    			$dirs[] = $file;
    		else
    			$files[] = $file;
    	}				
    }
    closedir($handle);



    so wie geh ich sowas in C an (C und nicht C++ wenns geht)

    wäre über n paar hinweiße froh
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo ballardn,

    das Auslesen von Verzeichnisdateien gehört leider nicht zum Sprachumfang von (ANSI) C, du musst hierfür auf entsprechende Funktionen des zugrundeliegenden Betriebssystems zugreifen (und dabei zwangläufig plattformabhängigen Code erzeugen). Unter POSIX-Kompatiblen System (Unix, Linux etc.) ist ein Verzeichnis im Prinzip eine Datei, welche eine Liste aller darunterliegenden Dateien enthält. Diese Listen kann man ähnlich auslesen wie auch in PHP. Zunächst brauchst du mal die Headerfiles dirent.h und sys/types.h. Analog zu den Dateifunktionen stehen dir für Verzeichnisse vier Funktionen zur Verfügung:

    DIR *opendir(const char *pfadname); 
    struct dirent *readdir(DIR *dp); 
    void rewinddir(DIR *dp); 
    int closedir(DIR *dp);

    Mit diesen Funktionen kannst du die Dateiliste durchlaufen, jeder Aufruf von readdir() liefert dir den nächsten Verzeichniseintrag zurück. Mit rewinddir() geht's zurück an den Anfang. Informationen über einen spezifischen Verzeichniseintrag bekommst du recht komfortabel über die Struktur dirent, welche so aussieht:

    struct dirent {
        long            d_ino;              /* Inodenummer */
        off_t           d_off;              /* Offset zum folgenden Eintrag */
        unsigned short  d_reclen;           /* Länge dieses Eintrags */
        char            d_name[NAME_MAX+1]; /* Dateiname */
    };

    Der einzige Stolperstein ist eigentlich, dass der dirent-Pointer halt nur bis zum nächsten Aufruf von readdir() gültig bleibt. Brauchst du die Informationen länger, musst du sie kopieren.

    Hier ein kleines (getestetes) Beispiel (Linux mit 2.6.15-Kernel, gcc 4.0.3):
    #include <dirent.h>
    #include <sys/types.h>
    #include <stdio.h>
    
    int main(int argc, char** argv) {
      DIR *mydir; /* Verzeichnispointer */
      struct dirent *dirinfo; /* Pointer auf einen Verzeichniseintrag */
      
      mydir=opendir("/home/ich/meinverzeichnis"); /* Verzeichnis öffnen */
      while((dirinfo=readdir(mydir))!=NULL) { /* Nacheinander alle Einträge holen */
        printf("%s\n", dirinfo->d_name); /* Dateiname anzeigen */
      }
      closedir(mydir);
      return 0;
    }

    Beachte dass hier die Fehlerbehandlung fehlt.


    Wie sowas unter Windows funktioniert kann ich dir leider nicht sagen, ich vermute aber, dass es im Prinzip ähnlich sein wird. Es kann auf jedenfall nicht schaden, wenn du einfach mal versuchst dieses Programm unter Windows zu kompilieren, der Compiler wird schon meckern wenn ihn was stört ;)

    MfG,
    thw
  4. Autor dieses Themas

    b******n

    Oh danke thw,

    werd mir dass mal genauer ansehen :)
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!