Readdir () garantit-il une commande?

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

Quelqu’un peut-il me dire si readdir garantit ou non une commande?

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

Note: J’ai cherché un peu de documentation définitive en disant que c’était le cas. Le lien le plus proche est le suivant

C’est loin d’être définitif, mais cela donne un bon 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.

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 est plutôt aléatoire. Un programme plus utile sortingerait les entrées (peut-être en les classant par ordre alphabétique) avant de les imprimer

De “l’interface de programmation Linux”:

Les noms de fichiers renvoyés par readdir () ne sont pas sortingés, 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 comment il remplit les lacunes du répertoire). liste de répertoires après la suppression des fichiers). (La commande ls –f répertorie les fichiers dans le même ordre non sortingé qu’ils seraient récupérés par readdir ().)

Nous pouvons utiliser la fonction scandir (3) pour récupérer une liste sortingée de fichiers correspondant à des 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.

Ce n’est explicitement pas garanti. Le classement suit souvent certaines règles, mais les règles sont suffisamment compliquées pour que vous ne deviez pas vous y fier. Le classement peut, par exemple, être affecté par d’autres opérations se déroulant dans le même répertoire, et vous ne pouvez pas les contrôler. Traitez le classement comme aléatoire et sortingez-le vous-même si nécessaire.

Non, readdir ne garantit aucune commande.

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

readdir () ne garantit aucun autre ordre que celui qui correspond à l’ordre de lecture du disque du système d’exploitation.


Selon les tests que j’ai effectués sur quelques plates-formes – Solaris – sun4sol, x86 sol, linux, Windows avec le code exemple, 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  #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; } 

En plus des autres réponses, la page de manuel readdir est très claire sur le classement 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 sortingés de quelque manière que ce soit.

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

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

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