c - dirent - ¿Readdir() garantiza un pedido?
readdir node (7)
Además de las otras respuestas, la página man de readdir es bastante clara sobre el orden de los archivos.
El orden en el que se leen los nombres de los archivos mediante sucesivas llamadas a readdir () depende de la implementación del sistema de archivos; es poco probable que los nombres se ordenen de alguna manera.
Algunos sistemas de archivos, como ReiserFS, listan los archivos en orden léxico.
En su caso, debe almacenar los nombres en una matriz y luego ordenar la matriz.
Por ejemplo, use qsort() para ordenar la matriz.
Estoy obteniendo una lista de archivos en un sistema similar a Linux utilizando opendir / readdir. Parece que las entradas del directorio se devuelven en orden alfabético de nombre de archivo. Sin embargo, no veo nada garantizado en las páginas de manual sobre esta orden.
¿Alguien puede decirme si Readdir garantiza o no una orden?
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 blanco). lista de directorios después de que se eliminan los archivos). (El comando ls –f enumera los archivos en el mismo orden no clasificado en el que readdir () los recuperaría).
Podemos usar la función scandir (3) para recuperar una lista ordenada de archivos que coinciden con los criterios definidos por el programador; Consulte 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.
El método readdir
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 diciendo que este es el caso. Lo más cercano que vine 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.
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 clasificaría las entradas (quizás alfabetizandolas) antes de imprimirlas
No está explícitamente garantizado. El orden a menudo sigue algunas reglas, pero las reglas son lo suficientemente complicadas como para que no deba confiar en ellas. El orden puede, por ejemplo, verse afectado por otras operaciones que ocurren en el mismo directorio, y usted no puede controlarlas. Trate el orden como aleatorio y ordene las cosas usted mismo si lo necesita.
No, readdir no garantiza ningún pedido.
(Algunos sistemas de archivos pueden almacenar las entradas de directorio en un cierto orden, en tales casos, readdir puede devolverlas en el mismo orden, pero eso no es una característica de readdir en sí).
readdir () no garantiza ningún otro orden superior al 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 ejemplo, todos los resultados se distribuyeron de forma aleatoria.
fuente: readdir () que comienza 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;
}