¿Readdir() garantiza un pedido?

5 minutos de lectura

avatar de usuario
Tomás

Obtengo una lista de archivos en un sistema similar a Linux usando opendir/readdir. Parece que las entradas del directorio se devuelven en orden alfabético de nombre de archivo. Sin embargo, no veo nada en las páginas del manual sobre la garantía de este pedido.

¿Alguien puede decirme si readdir garantiza o no un pedido?

  • Como regla general, lo más probable es que si no está en la documentación, la respuesta es no. Incluso si hubiera un orden consistente en todas las implementaciones, si no está documentado, probablemente no esté garantizado.

    – Dan Fego

    23 de enero de 2012 a las 19:34


  • Si están saliendo alfabéticamente, eso es casi seguro que originalmente fueron creado en orden alfabético, por ejemplo, por unzip o tar extrayéndolos como tal… readdir no da orden.

    – R.. GitHub DEJA DE AYUDAR A ICE

    23 de enero de 2012 a las 19:39

  • Por cierto, scandir puede ser útil si desea ordenar los resultados o tener acceso aleatorio a ellos. Está estandarizado en POSIX 2008 y antes era una extensión común.

    – R.. GitHub DEJA DE AYUDAR A ICE

    23 de enero de 2012 a las 19:42

  • El orden que obtiene depende casi con seguridad del sistema de archivos. En FAT32 obtengo los archivos en orden de creación, en NTFS generalmente en orden alfabético pero con algunas excepciones, en ext4 sin orden aparente. Ahí va tu pedido garantizado. 🙂

    – Mateo Italia

    23 de enero de 2012 a las 19:42


  • Incluso he visto un caso en el que “.” y “..” no fueron las primeras entradas (en un sistema de archivos montado en red). Y no contaría mucho con el orden de creación cuando se entremezclan creaciones y eliminaciones.

    – Un programador

    24 de enero de 2012 a las 10:51


avatar de usuario
jaredpar

los readdir El método no garantiza ningún pedido. Si desea asegurarse de que estén ordenados alfabéticamente, deberá hacerlo usted mismo.

Nota: busqué un poco de documentación definitiva que dijera que este es el caso. Lo más cerca que llegué es el siguiente enlace

De ninguna manera es definitivo, pero brinda una buena descripción general del comando, su historial y cómo su implementación suele ser un orden transversal.

avatar de usuario
Joachim Isaksson

En resumen, no, readdir() no garantiza ningún orden en particular.

de un ejemplo de readdir en el manual de glibc

El orden en que aparecen los archivos en un directorio tiende a ser bastante aleatorio. Un programa más útil ordenaría las entradas (quizás ordenándolas alfabéticamente) antes de imprimirlas

avatar de usuario
efannu-723

De “La interfaz de programación de Linux”:

Los nombres de archivo devueltos por readdir() no están ordenados, sino en el orden en que ocurren en el directorio (esto depende del orden en que el sistema de archivos agrega archivos al directorio y cómo llena los espacios en la lista de directorios después de eliminar los archivos) . (El comando ls –f enumera los archivos en el mismo orden no clasificado en el que serían recuperados por readdir().)

Podemos usar la función scandir(3) para recuperar una lista ordenada de archivos que coincidan con los criterios definidos por el programador; vea la página del manual para más detalles. Aunque no se especifica en SUSv3, scandir() se proporciona en la mayoría de las implementaciones de UNIX.

Nota: scandir es parte de POSIX.1-2008. Una versión autorizada por derechos de autor definida en torno a readdir está disponible en LibreBSD libc.

No está garantizado explícitamente. El orden a menudo sigue algunas reglas, pero las reglas son lo suficientemente complicadas como para no confiar en ellas. El orden puede, por ejemplo, verse afectado por otras operaciones que ocurren en el mismo directorio y no puede controlarlas. Trate el orden como aleatorio y ordene las cosas usted mismo si es necesario.

No, readdir no garantiza ningún pedido.

(Algunos sistemas de archivos pueden almacenar entradas de directorio en un cierto orden, en tales casos, readdir puede devolverlas en el mismo orden, pero esa no es una característica de readdir en sí).

avatar de usuario
Ôrel

readdir() no garantiza ningún otro orden por encima del orden de lectura del disco del sistema operativo.


De acuerdo con la prueba que realicé en algunas plataformas: Solaris, sun4sol, x86 sol, linux, Windows con el código de muestra, todos los resultados se mostraron de manera aleatoria.


fuente: readdir() comenzando con puntos en lugar de archivos

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int main() {

    DIR *dir;
    struct dirent *dp;
    char * file_name;
    char dirpath [100] ;


    while(1==1){
        printf("Choose dir:");
        scanf("%s",dirpath);
        dir = opendir(dirpath);
        while ((dp=readdir(dir)) != NULL) {
            if ( !strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..") )
            {
                // do nothing (straight logic)
            } else {
                file_name = dp->d_name; // use it
                printf("file_name: \"%s\"\n",file_name);
            }
        }
        closedir(dir);
    }

    return 0;
}

avatar de usuario
Deja Vu

Además de las otras respuestas, la página de manual de readdir es bastante claro sobre el orden de los archivos.

El orden en que se leen los nombres de archivo mediante llamadas sucesivas a readdir() depende de la implementación del sistema de archivos; es poco probable que los nombres se clasifiquen de alguna manera.

Algunos sistemas de archivos, como ReiserFS, enumeran los archivos en orden léxico.

En su caso, debe almacenar los nombres en una matriz y luego ordenar la matriz.

Por ejemplo, use qordenar() para ordenar la matriz.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad