2016-06-05 16 views
0

Grundsätzlich bisher habe ich diesen Code:Liste Dateien in Verzeichnissen Glob mit() in C

#include <glob.h> 
#include <string.h> 
#include <stdio.h> 

# define ERROR 1 
# define FAILURE -1 

int    main(int ac, char **av) 
{ 
    glob_t  globlist; 
    int   i; 

    i = 0;    
    if (ac == 1) 
    return (-1); 
    else 
    { 
     if (glob(av[1], GLOB_PERIOD, NULL, &globlist) == GLOB_NOSPACE 
      || glob(av[1], GLOB_PERIOD, NULL, &globlist) == GLOB_NOMATCH) 
     return (FAILURE); 
     if (glob(av[1], GLOB_PERIOD, NULL, &globlist) == GLOB_ABORTED) 
     return (ERROR); 
     while (globlist.gl_pathv[i]) 
     { 
      printf("%s\n", globlist.gl_pathv[i]); 
      i++; 
     } 
    } 
    return (0); 
} 

Wenn ich ./a.out "*" zum Beispiel gebe sie all meine Dateien drucken, wo ich bin, aswell als Verzeichnisse, aber es druckt nicht, was in Verzeichnissen ist. Wie soll ich ALLE Dateien einschließlich Unterdateien/Ordner drucken?

Dank

+1

Völlig unabhängig von Ihrem Problem, aber Sie sollten '-1' nicht aus der' main' Funktion zurückgeben. Geben Sie "0" bei "Erfolg" und einen * positiven * Wert von weniger als 256 bei "Fehler" zurück. Dies liegt daran, dass auf POSIX-Systemen (einschließlich Linux, OSX und allen modernen Unix-Systemen) die höheren Bits eine besondere Bedeutung haben. –

+0

Vielleicht möchten Sie sich die Funktionen prototyped in 'dirent.h' anschauen. – alk

+0

@alk Ich weiß über dirent.h aber ich weiß nicht wirklich, wie man es gut verwendet. Wie ich denke, ich muss rekursiv machen, liege ich falsch? – iNukeLaPeste

Antwort

2

Verwenden nftw() statt glob() wenn Sie ganze Bäume untersuchen möchten, anstatt einen bestimmten Pfad und Dateinamen-Muster.

(Es ist absolut albern, das Rad neu zu erfinden, indem man es mit opendir()/readdir()/closedir()) vor allem, weil nftw() sollte Dateisystemänderungen anmutig behandeln, während selbst gesponnener Baum gehen Code in der Regel ignoriert all die harten Sachen, und funktioniert nur in optimalen Bedingungen auf Ihrer eigenen Maschine, in spektakulären und wunderbaren Möglichkeiten anderswo.)

In der Filterfunktion, verwenden fnmatch(), um zu entscheiden, ob der Dateiname mit Glob-Mustern zulässig ist.

Wenn Sie stattdessen mit regulären Ausdrücken filtern möchten, verwenden Sie regcomp(), um die Muster vor dem Aufruf von nftw() und dann regexec() in Ihrer Filterfunktion zu kompilieren. (Reguläre Ausdrücke sind mächtiger als Glob-Muster, und sie sind zu einer festen Zustandsmaschine zusammengestellt, so dass sie sehr effizient, auch.)

Wenn Sie sich nicht sicher über den Unterschied sind, ist der Wikipedia-Artikel auf glob patterns und regular expressions sehr nützlich und informativ.

Alle oben genannten sind in POSIX.1-2008 definiert, so dass sie auf allen POSIX-y-Betriebssystemen portierbar sind.

+0

Vielen Dank für all diese Informationen. Leider kann ich nftw nicht verwenden, da es sich um ein Schulprojekt handelt und diese Funktion nicht erlaubt ist. – iNukeLaPeste

+0

@iNukeLaPeste: In diesem Fall sollten Sie vielleicht eine Schleife über alle Befehlszeilenparameter betrachten, anstatt nur die erste zu verwenden, 'av [1]'? Auf diese Weise können Sie mehrere Glob-Patterns bereitstellen, zum Beispiel "*" */* "*/*/*", um Dateien bis zu drei Verzeichnissen tief zu betrachten. Das rekursive Durchsuchen von Verzeichnissen ist sehr einfach zu stolpern, und wirklich, ** wirklich **, sollte sorgfältig durchgeführt werden. –

+0

Einer meiner Lieblingsausflügler ist "new =" dirname "; i = 1; obwohl wahr; tue alt = "$ new"; new = "dirname $ i"; i = $ [i + 1]; mv "$ alt" "$ neu"; in einem anderen Fenster innerhalb des Baums, den Sie rekursiv überprüfen. (Es benennt ein Verzeichnis mit dem ursprünglichen Namen 'dirname' als' dirname1' um, wobei die Zahl jedes Mal so oft wie möglich erhöht wird. Es ist ein Stresstest einer Art.) Eine korrekt geschriebene Baumrekursion stört es nicht, obwohl sie es vermissen kann der Teilbaum, der bei diesem Namensänderungsverzeichnis beginnt. Schlecht geschriebene Implementierungen werden durcheinander gebracht und wiederholen sich oder stürzen ab. –