web-dev-qa-db-fra.com

Readdir () garantit-il une commande?

Je reçois une liste de fichiers sur un système de type Linux en utilisant opendir/readdir. Il semble que les entrées du répertoire soient renvoyées dans l'ordre alphabétique du nom de fichier. Cependant, je ne vois rien dans les pages de manuel sur la garantie de cette commande.

Quelqu'un peut-il me dire si readdir garantit une commande?

49
Tom

La méthode readdir ne garantit aucune commande. Si vous voulez vous assurer qu'ils sont triés par ordre alphabétique, vous devrez le faire vous-même.

Remarque: J'ai cherché un peu de documentation définitive indiquant que c'est le cas. Le plus proche je suis venu est le lien suivant

Ce n'est en aucun cas définitif, mais cela donne un bel aperçu de la commande, de son historique et de la façon dont son implémentation est généralement un ordre de traversée.

40
JaredPar

En bref, non, readdir () ne garantit aucun ordre particulier.

à partir d'un exemple readdir dans le manuel glibc

L'ordre dans lequel les fichiers apparaissent dans un répertoire a tendance à être assez aléatoire. Un programme plus utile trierait les entrées (peut-être en les alphabétisant) avant de les imprimer

13
Joachim Isaksson

De "L'interface de programmation Linux":

Les noms de fichiers renvoyés par readdir () ne sont pas dans l'ordre trié, mais plutôt dans l'ordre dans lequel ils se produisent dans le répertoire (cela dépend de l'ordre dans lequel le système de fichiers ajoute des fichiers au répertoire et de la façon dont il comble les lacunes dans le répertoire). répertoire après suppression des fichiers). (La commande ls –f répertorie les fichiers dans le même ordre non trié qu'ils seraient récupérés par readdir ().)

Nous pouvons utiliser la fonction scandir (3) pour récupérer une liste triée de fichiers correspondant aux critères définis par le programmeur; voir la page de manuel pour plus de détails. Bien que non spécifié dans SUSv3, scandir () est fourni sur la plupart des implémentations UNIX.

9
efannu-723

Ce n'est explicitement pas garanti. La commande suit souvent certaines règles, mais les règles sont suffisamment compliquées pour que vous ne deviez pas vous y fier. La commande peut, par exemple, être affectée par d'autres opérations se produisant dans le même répertoire, et vous ne pouvez pas les contrôler. Traitez la commande comme aléatoire et triez les choses vous-même si vous en avez besoin.

8
user25148

Non, readdir ne garantit aucune commande.

(Certains systèmes de fichiers peuvent stocker des entrées de répertoire dans un certain ordre, dans ce cas, readdir peut vous les renvoyer dans le même ordre, mais ce n'est pas une fonctionnalité de readdir lui-même.)

6
nos

readdir () ne garantit aucun autre ordre supérieur à celui qui est l'ordre de lecture du disque du système d'exploitation.


Selon le test que j'ai fait sur quelques plates-formes - Solaris - Sun4sol, x86 sol, linux, Windows avec l'exemple de code, tous les résultats ont été déplacés de manière aléatoire.


source: readdir () commençant par des points au lieu de fichiers

#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;
}
2
Wojciech Papaj

En plus des autres réponses, la page de manuel readdir est assez claire sur l'ordre des fichiers.

L'ordre dans lequel les noms de fichiers sont lus par appels successifs à readdir () dépend de l'implémentation du système de fichiers; il est peu probable que les noms soient triés de quelque façon que ce soit.

Certains systèmes de fichiers, comme ReiserFS, répertorient les fichiers dans l'ordre lexical.

Dans votre cas, vous devez stocker les noms dans un tableau, puis trier le tableau.

Par exemple, utilisez qsort () pour trier le tableau.

1
Ring Ø