scandir, scandirat, alphasort, versionsort - durchsucht ein Verzeichnis nach
passenden Einträgen
Standard-C-Bibliothek (
libc,
-lc)
#include <dirent.h>
int scandir(const char *restrict Verzz,
struct dirent ***restrict namelist,
int (*filter)(const struct dirent *),
int (*vergl)(const struct dirent **,
const struct dirent **));
int alphasort(const struct dirent **a, const struct dirent **b);
int versionsort(const struct dirent **a, const struct dirent **b);
#include <fcntl.h> /* Definition von AT_*-Konstanten */
#include <dirent.h>
int scandirat(int Verzdd, const char *restrict Verzz,
struct dirent ***restrict namelist,
int (*filter)(const struct dirent *),
int (*vergl)(const struct dirent **,
const struct dirent **));
scandir(),
alphasort():
/* Seit Glibc 2.10: */ _POSIX_C_SOURCE >= 200809L
|| /* Glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
versionsort():
_GNU_SOURCE
scandirat():
_GNU_SOURCE
Die Funktion
scandir() durchsucht das Verzeichnis
Verzz und ruft
für jeden Verzeichniseintrag
filter() auf. Einträge,
für die
filter() einen Wert ungleich 0 zurückgibt, werden
in Zeichenketten gespeichert, derenSpeicher mit
malloc(3) reserviert
wird. Danach werden die Zeichenkettenmit
qsort(3) unter Verwendung der
Vergleichsfunktion
vergl() sortiert und im Feld
namelist
gesammelt, dessen Speicher ebenfalls mit
malloc(3) reserviert wird.
Falls
filter gleich NULL ist, werden alle Einträge
ausgewählt.
Die Funktionen
alphasort() und
versionsort() können als die
Vergleichsfunktion
vergl() benutzt werden. Die erste sortiert die
Verzeichniseinträge mittels
strcoll(3), die letztere
strverscmp(3) auf den Zeichenketten
(*a)->d_name und
(*b)->d_name.
Die Funktion
scandirat() funktioniert genauso wie
scandir(),
abgesehen von den hier beschriebenen Unterschieden.
Falls der in
Verzz angegebene Pfadname relativ ist, wird er relativ zu
dem Verzeichnis interpretiert, auf das sich der Dateideskriptor
Verzdd
bezieht (statt relativ zum aktuellen Arbeitsverzeichnis des aufrufenden
Prozesses, so wie
scandir() einen relativen Pfadnamen behandeln
würde).
Falls
Verzz relativ ist und
Verzdd den besonderen Wert
AT_FDCWD annimmt, wird
Verzz als relativ zum aktuellen
Arbeitsverzeichnis des aufrufenden Prozesses interpretiert (wie von
scandir()).
Falls
Verzz absolut ist, wird
Verzdd ignoriert.
Lesen Sie
openat(2) für die Erklärung der Notwendigkeit von
scandirat().
Die Funktion
scandir() liefert die Anzahl ausgewählter
Verzeichniseinträge oder im Fehlerfall -1 zurück, wobei
errno gesetzt wird, den Fehler anzuzeigen.
Die Funktionen
alphasort() und
versionsort() liefern eine Zahl
kleiner als Null, Null, oder größer als Null zurück, wenn
das erste Argument entsprechend als kleiner, gleich oder größer
als das zweite Argument angesehen wird.
- EBADF
- (scandirat()) Verzz ist relativ, aber
Verzdd ist weder AT_FDCWD noch ein gültiger
Dateideskriptor.
- ENOENT
- Der Pfad in Verzz existiert nicht.
- ENOMEM
- Der Speicher reicht nicht aus, um den Vorgang zu
beenden.
- ENOTDIR
- Der Pfad in Verzz ist kein Verzeichnis.
- ENOTDIR
- (scandirat()) Verzz ist ein relativer
Pfadname und Verzdd ist ein Dateideskriptor, der sich auf eine
Datei bezieht, die kein Verzeichnis ist.
versionsort() wurde der Glibc in Version 2.1 hinzugefügt.
scandirat() wurde der Glibc in Version 2.15 hinzugefügt.
Siehe
attributes(7) für eine Erläuterung der in diesem
Abschnitt verwandten Ausdrücke.
Schnittstelle |
Attribut |
Wert |
scandir(), scandirat() |
Multithread-Fähigkeit |
MT-Safe |
alphasort(), versionsort() |
Multithread-Fähigkeit |
MT-Safe locale |
alphasort(),
scandir(): 4.3BSD, POSIX.1-2008.
versionsort() und
scandirat() sind GNU-Erweiterungen.
Seit Glibc 2.1 verwendet
alphasort()
strcoll(3); früher
nutzte sie
strcmp(3).
Vor Glibc 2.10 hatten die zwei Argumente von
alphasort() und
versionsort() den Typ
const void *. Als
alphasort() in POSIX.1-2008 standardisiert wurde, wurde der
Argumententyp als typsicherer
const struct dirent **
spezifiziert und Glibc 2.10 änderte die Definitionen von
alphasort() (und dem nicht standardisierten
versionsort()), um
auf den Standard zu passen.
Das nachfolgende Programm gibt eine Liste von Dateien im aktuellen Verzeichnis
in umgekehrter Reihenfolge aus.
#define _DEFAULT_SOURCE
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
struct dirent **Namensliste;
int n;
n = scandir(".", &Namensliste, NULL, alphasort);
if (n == -1) {
perror("scandir");
exit(EXIT_FAILURE);
}
while (n--) {
printf("%s\n", Namensliste[n]->d_name);
free(Namensliste[n]);
}
free(Namensliste);
exit(EXIT_SUCCESS);
}
closedir(3),
fnmatch(3),
opendir(3),
readdir(3),
rewinddir(3),
seekdir(3),
strcmp(3),
strcoll(3),
strverscmp(3),
telldir(3)
Die deutsche Übersetzung dieser Handbuchseite wurde von Markus Kaufmann
<
[email protected]>, Martin Eberhard Schauer
<
[email protected]>, Mario Blättermann
<
[email protected]> und Helge Kreutzmann
<
[email protected]> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die
GNU
General Public License Version 3 oder neuer bezüglich der
Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken
Sie bitte eine E-Mail an die
Mailingliste
der Übersetzer