Triviale Frage Komplettes Verzeichnis einlesen - scandir()



  • Hallo,

    ich habe das Programm find_dir nach der Anleitung von http://www.pronix.de/pronix-90.html erstellt.

    Nun möchte ich die Rückgaben weiterverarbeiten.

    Das Programm liefert mir z.B. folgendes zurück.

    48.png
    convergence.png
    desktop.png
    meter.png
    tux.png

    So weit ich das verstanden habe, stehen die Ergebnisse in
    "namelist", wie kann ich gezielt Eitnräge daraus ansprechen?
    "namelist[2]" z.B. für convergence.png hat leider nicht
    funktioniert. Ich habe ebenfalls "free (namelist)"
    und "free (*list)" schon auskommentiert, das ganze brachte aber
    leider auch keinen Erfolg. Ich hoffe, ihr könnt mir helfen.

    Gruß tui87

    /* find_dir.c */
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
    #include <regex.h>
    #include <unistd.h>
    #define MAX 255
    
    static int search = 0;
    static regex_t regexpr;
    
    static int my_select (const struct dirent *dp) {
       if(search == 0)
          return 1;
       if (regexec(&regexpr, dp->d_name, 0, NULL, 0) == 0)
          return 1;
       else
          return 0;
    }
    
    int main (int argc, char **argv) {
       int num_entries, i;
       struct dirent **namelist, **list;
       const char *ptr = NULL;
       char wd[MAX];
    
       if (argc < 2)
          ptr = ".";
       else
          ptr = argv[1];
       if(argc == 3) {
         if (regcomp(&regexpr, argv[2], REG_EXTENDED)) {
            printf("Problem beim Ausdruck %sn", argv[2]);
            return EXIT_FAILURE;
         }
         search = 1;
        }
    
       if((num_entries =scandir(ptr, &namelist, my_select, 0)) < 0) {
          fprintf (stderr, "Unerwarteter Fehler\n");
          exit (EXIT_FAILURE);
       }
       chdir (ptr);
       getcwd (wd, MAX);
       printf ("Anzahl der Einträge in %s: %d\n", wd, num_entries);
       if (num_entries) {
          printf ("Die Einträge:\n");
          for (i = 0, list=namelist; i < num_entries; i++, *list++){
             printf (" %s\n", (*list)->d_name);
             free (*list);
          }
          free (namelist);
          printf ("\n");
       }
       printf ("\n");
       regfree(&regexpr);
       return EXIT_SUCCESS;
    


  • Elemente der Struktur kannst du so ansprechen, wie es in dem Code auch schon passiert:

    (*list)->d_name
    

    d_name ist ein Element. Weitere findest du sicher in der Definition der Struktur.

    EDIT: free einfach auskommentieren ist natürlich keine gute Idee. Wenn du noch mehr mit den Daten machen willst, dann pack die free-Aufrufe weiter nach unten.



  • for ( i = 0, list=namelist; i < num_entries; i++, list++ )
    

    Hier war hinten ein * zuviel. namelist ist ein Zeiger auf das erste Element eines Array von Zeigern auf dirent. Wenn list auf das erste Element dieses Array zeigt, zeigt (list+1) auf das zweite.

    Demnach sollte auch namelist[2]->d_name funktionieren.


Log in to reply