2012-01-23 23 views
44

Obtengo una lista de archivos en un sistema similar a Linux usando opendir/readdir. Parece que las entradas de directorio se devuelven en orden alfabético de nombre de archivo. Sin embargo, no veo nada en las páginas man acerca de este orden garantizado.¿readdir() garantiza una orden?

¿Alguien me puede decir si readdir garantiza o no un pedido?

+0

Como regla general, las probabilidades son 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. –

+4

Si salen en orden alfabético, es casi seguro que fueron originalmente * creados * en orden alfabético, p. por 'unzip' o' tar' extrayéndolos como tales ... 'readdir' no proporciona ningún orden. –

+1

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

Respuesta

34

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

Nota: Busqué un poco para la documentación definitiva diciendo que este es el caso. Lo más cerca que llegué es el siguiente enlace

No es de ninguna manera definitivo, pero sí da una buena visión general de la orden, su historia y la forma en que es de aplicación es normalmente de orden transversal.

8

explícitamente no se garantiza. 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 suceden en el mismo directorio, y usted no puede controlarlas. Trate el orden como al azar, y ordene las cosas usted mismo si lo necesita.

6

No, readdir no garantiza ningún pedido.

(algunos sistemas de archivos almacenar entradas de directorio en un cierto orden, en tales casos readdir podría devolverlos a que en el mismo orden, pero eso no es una característica de readdir sí mismo.)

13

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

de un ejemplo readdir en el glibc manual

El orden en el que aparecen los archivos en un directorio tiende a ser bastante azar. Un programa más útil sería ordenar las entradas (tal vez por alphabetizing ellos) antes de imprimirlas

+3

Falló el enlace. Encontré una instantánea en [web.archive.org] (https://web.archive.org/web/20120531021029/http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02 /library_13.html) para cualquier persona interesada. – iplus26

9

De "La interfaz de programación de Linux":

Los nombres de los archivos devueltos por readdir() no están en el orden establecido, pero más bien en el orden en el que ocurren en el directorio (esto depende del orden en que el sistema de archivos agrega archivos al directorio y cómo rellena los huecos en el directorio después de que se eliminan los archivos). (El comando ls-f se incluyen archivos en el mismo orden sin ordenar que iban a ser recuperados por readdir()).

Podemos utilizar la función scandir (3) para recuperar una lista ordenada de los archivos que coinciden definido programador criterios; ver 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.

2

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


De acuerdo con la prueba que he hecho en algunas plataformas Solaris - - sun4sol, sol x86, Linux, Windows con el código de ejemplo todos los resultados fueron displated de manera aleatoria.


fuente: readdir() beginning with dots instead of files

#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; 
} 
1

Además de las otras respuestas, la readdir man page es bastante clara acerca de los archivos pedidos.

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, luego ordenar la matriz. Por ejemplo, use qsort() para ordenar la matriz.

Cuestiones relacionadas