NOMBRE¶
scandir, alphasort, versionsort - busca en un directorio entradas coincidentes
SINOPSIS¶
#include <dirent.h>
int scandir(const char *dir, struct dirent ***namelist,
int(*select)(const struct dirent *),
int(*compar)(const struct dirent **, const struct dirent **));
int alphasort(const void *a, const void *b);
int versionsort(const void *a, const void *b);
DESCRIPCIÓN¶
La función
scandir() rastrea el directorio
dir, llamando
select() en cada entrada de directorio. Las entradas para las que
select() devuelve un valor distinto de cero se almacenan en cadenas
(strings) reservadas vía
malloc(), ordenadas usando
qsort() con la función de comparación
compar(), y
puestas en la matriz
namelist que está reservada vía
malloc(). Si
select es NULL, se seleccionan todas las entradas.
Las funciones
alphasort() y
versionsort() pueden ser utilizadas
como la función de comparación
compar(). La primera
ordena las entradas de directorio usando
strcoll(3), la última
usando
strverscmp(3) sobre las cadenas
(*a)->d_name y
(*b)->d_name.
VALOR DEVUELTO¶
La función
scandir() devuelve el número de entradas de
directorio seleccionadas, o -1 si hubo algún error.
Las funciones
alphasort() y
versionsort() devuelven un entero
menor que, igual a, o mayor que cero si el primer argumento se considera
respectivamente menor que, igual a, o mayor que el segundo argumento.
ERRORES¶
- ENOMEM
- Memoria insuficiente para completar la operación.
Ninguna de estas funciones está en POSIX. Las funciones
scandir()
y
alphasort() son de BSD 4.3, y están disponibles bajo Linux
desde libc4. Libc4 y libc5 usan el prototipo más preciso
int alphasort(const struct dirent **a, const struct dirent **b);
pero glibc 2.0 vuelve al prototipo impreciso de BSD.
La función
versionsort() es una extensión de GNU,
disponible desde glibc 2.1. Desde glibc 2.1,
alphasort() invoca a
strcoll(3); anteriormente usaba
strcmp(3).
EJEMPLO¶
/* imprimir ficheros en el directorio actual en orden inverso */
#include <dirent.h>
main(){
struct dirent **namelist;
int n;
n = scandir(".", &namelist, 0, alphasort);
if (n < 0)
perror("scandir");
else {
while(n--) {
printf("%s\n", namelist[n]->d_name);
free(namelist[n]);
}
free(namelist);
}
}
VÉASE TAMBIÉN¶
closedir(3),
fnmatch(3),
opendir(3),
readdir(3),
rewinddir(3),
seekdir(3),
strcmp(3),
strcoll(3),
strverscmp(3),
telldir(3)