scandir, scandirat, alphasort, versionsort - Sélectionner des
éléments d'un répertoire
Bibliothèque C standard (
libc,
-lc)
#include <dirent.h>
int scandir(const char *restrict dirp,
struct dirent ***restrict namelist,
int (*filter)(const struct dirent *),
int (*compar)(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> /* Définition des constantes AT_* */
#include <dirent.h>
int scandirat(int dirfd, const char *restrict dirp,
struct dirent ***restrict namelist,
int (*filter)(const struct dirent *),
int (*compar)(const struct dirent **,
const struct dirent **));
scandir(),
alphasort() :
/* Since glibc 2.10: */ _POSIX_C_SOURCE >= 200809L
|| /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE
versionsort() :
_GNU_SOURCE
scandirat() :
_GNU_SOURCE
La fonction
scandir() examine le répertoire
dirp, en
appelant
filter() pour chaque élément rencontré.
Les entrées pour lesquelles
filter() renvoie une valeur non
nulle sont stockées dans une table allouée avec
malloc(3), triées avec
qsort(3) en utilisant la fonction
de comparaison
compar(), puis regroupées dans une table
namelist allouée avec
malloc(3). Si
filter est
NULL, toutes les entrées sont sélectionnées.
Les fonctions
alphasort() et
versionsort() peuvent être
utilisées comme la fonction de comparaison
compar. La
première trie les entrées du répertoire en ordre
alphabétique en utilisant
strcoll(3), la seconde en utilisant
strverscmp(3) sur les chaînes
(*a)->d_name et
(*b)->d_name.
La fonction
scandirat() fonctionne exactement comme
scandir(), les
seules différences étant décrites ici.
Si le nom de chemin donné dans
dirp est relatif, il est
considéré relatif au répertoire
référencé par le descripteur de fichier
dirfd
(plutôt que relatif au répertoire de travail actuel du processus
appelant, comme avec
scandir() pour un nom de chemin relatif).
Si
dirp est relatif et que
dirfd est la valeur particulière
AT_FDCWD, alors
dirp est considéré relatif au
répertoire de travail actuel du processus appelant (comme
scandir()).
Si
dirp est absolu, alors
dirfd est ignoré.
Consultez
openat(2) pour une explication sur la nécessité
de
scandirat().
La fonction
scandir() renvoie le nombre d'entrées du
répertoire sélectionné si elle réussit, ou
-1 si elle échoue, avec
errno contenant le code d'erreur.
Les fonctions
alphasort() et
versionsort() renvoient un entier
négatif, nul ou positif si le premier argument est respectivement
inférieur, égal ou supérieur au second.
- EBADF
- (scandirat()) dirp is relative but
dirfd is neither AT_FDCWD nor a valid file descriptor.
- ENOENT
- Le chemin n'existe pas dans dirp.
- ENOMEM
- Pas assez de mémoire pour terminer
l'opération.
- ENOTDIR
- Le chemin n'est pas un répertoire de
dirp.
- ENOTDIR
- (scandirat()) dirp est un chemin relatif et
dirfd est un descripteur de fichier
référençant un fichier qui n'est pas un
répertoire.
versionsort() was added in glibc 2.1.
scandirat() was added in glibc 2.15.
Pour une explication des termes utilisés dans cette section, consulter
attributes(7).
Interface |
Attribut |
Valeur |
scandir(), scandirat() |
Sécurité des threads |
MT-Safe |
alphasort(), versionsort() |
Sécurité des threads |
MT-Safe locale |
alphasort(),
scandir() : 4.3BSD, POSIX.1-2008.
versionsort() et
scandirat() sont des extensions GNU.
Depuis la version 2.1 de la glibc, la fonction
alphasort() invoque
strcoll(3). Dans les versions précédentes, elle appelait
strcmp(3).
Avant la version 2.10 de la glibc, les deux arguments de
alphasort() et
versionsort() sont typés comme des
const void *. Dans la standardisation par POSIX.1-2008 de
alphasort(), le type de l'argument est le type sûr
const
struct dirent **, et la version 2.10 de la glibc change
cette définition d'
alphasort() (et le non standard
versionsort()) pour se conformer à la norme.
Le programme suivant imprime une liste des fichiers dans le répertoire
courant dans l'ordre inverse.
#define _DEFAULT_SOURCE
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
struct dirent **namelist;
int n;
n = scandir(".", &namelist, NULL, alphasort);
if (n == -1) {
perror("scandir");
exit(EXIT_FAILURE);
}
while (n--) {
printf("%s\n", namelist[n]->d_name);
free(namelist[n]);
}
free(namelist);
exit(EXIT_SUCCESS);
}
closedir(3),
fnmatch(3),
opendir(3),
readdir(3),
rewinddir(3),
seekdir(3),
strcmp(3),
strcoll(3),
strverscmp(3),
telldir(3)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]> et
Grégoire Scano <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]