O readdir () garante um pedido?

Estou recebendo uma lista de arquivos em um sistema semelhante ao linux usando o opendir / readdir. Parece que as inputs de diretório são retornadas em ordem alfabética de nome de arquivo. No entanto, não vejo nada nas páginas do manual sobre esse pedido ser garantido.

Alguém pode me dizer se ou não readdir guarrantees uma ordem?

O método readdir não garante qualquer pedido. Se você quiser garantir que eles sejam classificados em ordem alfabética, você precisará fazê-lo você mesmo.

Nota: Eu procurei por um pouco de documentação definitiva dizendo que este é o caso. O mais próximo que eu vim é o seguinte link

Não é de forma alguma definitiva, mas dá uma boa visão geral do comando, sua história e como a sua implementação é tipicamente a ordem de passagem.

Em suma, não, readdir () não garante qualquer ordem particular.

de um exemplo readdir no manual da glibc

A ordem em que os arquivos aparecem em um diretório costuma ser aleatória. Um programa mais útil classificaria as inputs (talvez por ordem alfabética) antes de imprimi-las

De “A interface de programação linux”:

Os nomes de arquivos retornados por readdir () não estão na ordem de sorting, mas na ordem em que ocorrem no diretório (isso depende da ordem em que o sistema de arquivos adiciona arquivos ao diretório e como ele preenche lacunas no diretório). lista de diretórios depois que os arquivos são removidos). (O comando ls –f lista os arquivos na mesma ordem não classificada que seriam recuperados por readdir ().)

Podemos usar a function scandir (3) para recuperar uma lista ordenada de arquivos que correspondem aos critérios definidos pelo programador; veja a página de manual para detalhes. Embora não seja especificado no SUSv3, scandir () é fornecido na maioria das implementações do UNIX.

É explicitamente não garantido. A ordenação geralmente segue algumas regras, mas as regras são complicadas o suficiente para que você não confie nelas. A ordenação pode, por exemplo, ser afetada por outras operações que acontecem no mesmo diretório, e você não pode controlá-las. Trate a ordem como aleatória e ordene as coisas você mesmo, se precisar.

Não, readdir não garante nenhum pedido.

(Alguns filesystems podem armazenar inputs de diretório em uma determinada ordem, em tais casos o readdir pode retorná-los para você na mesma ordem, mas isso não é um recurso do próprio readdir.)

readdir () não garante nenhuma outra ordem acima daquela que é a ordem de leitura do disco do sistema operacional.


De acordo com o teste que eu fiz em algumas plataformas – Solaris – sun4sol, x86 sol, linux, Windows com o código de exemplo todos os resultados foram deslocados de forma aleatória.


source: readdir () começando com pontos em vez de arquivos

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

Além das outras respostas, a página de manual readdir é bem clara sobre a ordenação de arquivos.

A ordem em que os nomes de arquivos são lidos por chamadas sucessivas para readdir () depende da implementação do sistema de arquivos; É improvável que os nomes sejam classificados de qualquer maneira.

Alguns filesystems, como o ReiserFS, listam os arquivos em ordem lexical.

No seu caso, você precisa armazenar os nomes em uma matriz e, em seguida, classificar a matriz.

Por exemplo, use qsort () para ordenar o array.