scandir
Table des matières
Retour à l'index
NOM
scandir, scandirat, alphasort, versionsort - Sélectionner des éléments d'un
répertoire
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#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 **));
Exigences de macros de test de fonctionnalités pour la glibc (consulter
feature_test_macros(7)) :
scandir(), alphasort() :
/* Depuis la glibc 2.10 : */ _POSIX_C_SOURCE >= 200809L
|| /* glibc <= 2.19 : */ _BSD_SOURCE
versionsort() :
_GNU_SOURCE
scandirat() :
_GNU_SOURCE
DESCRIPTION
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.
scandirat()
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().
VALEUR RENVOYÉE
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.
ERREURS
- EBADF
-
(scandirat()) dirp est relatif mais dirfd n'est ni AT_FDCWD, ni
un descripteur de fichier valable.
- 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.
ATTRIBUTS
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
|
STANDARDS
- alphasort()
-
scandir()
POSIX.1-2008.
- versionsort()
-
scandirat()
GNU.
HISTORIQUE
- alphasort()
-
scandir()
4.3BSD, POSIX.1-2008.
- versionsort()
-
glibc 2.1.
- scandirat()
-
glibc 2.15.
NOTES
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 glibc 2.10, 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 glibc 2.10 change cette
définition d'alphasort() (et le non standard versionsort()) pour se
conformer à la norme.
EXEMPLES
Le programme suivant imprime une liste des fichiers dans le répertoire
courant dans l'ordre inverse.
Source du programme
#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);
}
VOIR AUSSI
closedir(3), fnmatch(3), opendir(3), readdir(3),
rewinddir(3), seekdir(3), strcmp(3), strcoll(3),
strverscmp(3), telldir(3)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>
et
Grégoire Scano <gregoire.scano@malloc.fr>
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 à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- scandirat()
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- ATTRIBUTS
-
- STANDARDS
-
- HISTORIQUE
-
- NOTES
-
- EXEMPLES
-
- Source du programme
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:08 GMT, September 19, 2025