SCANDIR(3)

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.

CONFORME A
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)