Garantiert readdir() eine Bestellung?

Lesezeit: 4 Minuten

Toms Benutzeravatar
Tom

Ich erhalte eine Liste von Dateien auf einem Linux-ähnlichen System mit opendir/readdir. Es scheint, dass die Verzeichniseinträge in alphabetischer Reihenfolge des Dateinamens zurückgegeben werden. Ich sehe jedoch nichts in den Manpages darüber, dass diese Reihenfolge garantiert ist.

Kann mir jemand sagen, ob readdir eine Bestellung garantiert oder nicht?

  • Als Faustregel gilt: Wenn es nicht in der Dokumentation steht, lautet die Antwort wahrscheinlich nein. Selbst wenn bei allen Implementierungen eine konsistente Reihenfolge vorhanden ist, ist sie wahrscheinlich nicht garantiert, wenn sie nicht dokumentiert ist.

    – Dan Fego

    23. Januar 2012 um 19:34 Uhr


  • Wenn sie alphabetisch erscheinen, ist das mit ziemlicher Sicherheit nur so, dass sie ursprünglich waren erstellt in alphabetischer Reihenfolge, zB nach unzip oder tar sie als solche extrahieren … readdir gibt keine Ordnung.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    23. Januar 2012 um 19:39 Uhr

  • Übrigens, scandir kann nützlich sein, wenn Sie die Ergebnisse ordnen oder wahlfreien Zugriff darauf haben möchten. Es ist in POSIX 2008 standardisiert und war vorher eine gängige Erweiterung.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    23. Januar 2012 um 19:42 Uhr

  • Die Reihenfolge, die Sie erhalten, hängt fast sicher vom Dateisystem ab. Auf FAT32 erhalte ich die Dateien in der Reihenfolge ihrer Erstellung, auf NTFS normalerweise in alphabetischer Reihenfolge, aber mit einigen Ausnahmen, auf ext4 in keiner offensichtlichen Reihenfolge. Da geht Ihre garantierte Bestellung. 🙂

    – Matteo Italien

    23. Januar 2012 um 19:42 Uhr


  • Ich habe sogar einen Fall gesehen, wo “.” und “..” waren nicht die ersten Einträge (in einem Netzwerkdateisystem). Und ich würde nicht viel auf die Reihenfolge der Schöpfung zählen, wenn Schöpfungen und Löschungen vermischt sind.

    – Ein Programmierer

    24. Januar 2012 um 10:51 Uhr


Benutzeravatar von JaredPar
JaredPar

Das readdir Methode garantiert keine Reihenfolge. Wenn Sie sicherstellen möchten, dass sie alphabetisch sortiert sind, müssen Sie dies selbst tun.

Hinweis: Ich habe ein bisschen nach einer endgültigen Dokumentation gesucht, die besagt, dass dies der Fall ist. Am nächsten kam ich dem folgenden Link

Es ist keineswegs endgültig, aber es gibt einen guten Überblick über den Befehl, seine Geschichte und wie seine Implementierung typischerweise die Traversal-Reihenfolge ist.

Benutzeravatar von Joachim Isaksson
Joachim Isakson

Kurz gesagt, nein, readdir() garantiert keine bestimmte Reihenfolge.

aus einem readdir-Beispiel in der glibc-Handbuch

Die Reihenfolge, in der Dateien in einem Verzeichnis erscheinen, ist eher zufällig. Ein nützlicheres Programm würde die Einträge sortieren (vielleicht alphabetisch sortieren), bevor sie gedruckt werden

Benutzeravatar von efannu-723
efannu-723

Aus “Die Linux-Programmierschnittstelle”:

Die von zurückgegebenen Dateinamen readdir() sind nicht in sortierter Reihenfolge, sondern in der Reihenfolge, in der sie im Verzeichnis vorkommen (dies hängt von der Reihenfolge ab, in der das Dateisystem Dateien zum Verzeichnis hinzufügt und wie es Lücken in der Verzeichnisliste füllt, nachdem Dateien entfernt wurden) . (Der Befehl ls –f listet Dateien in derselben unsortierten Reihenfolge auf, in der sie abgerufen würden readdir().)

Wir können die Funktion verwenden scandir(3) um eine sortierte Liste von Dateien abzurufen, die programmiererdefinierten Kriterien entsprechen; Einzelheiten finden Sie auf der Handbuchseite. Obwohl nicht in SUSv3 spezifiziert, scandir() wird in den meisten UNIX-Implementierungen bereitgestellt.

Hinweis: scandir ist ein Teil von POSIX.1-2008. Eine zulässigerweise urheberrechtlich geschützte Version, die um definiert ist readdir ist verfügbar in FreeBSD-libc.

Es ist ausdrücklich nicht garantiert. Die Bestellung folgt oft einigen Regeln, aber die Regeln sind kompliziert genug, dass Sie sich nicht darauf verlassen sollten. Die Reihenfolge kann zum Beispiel von anderen Vorgängen beeinflusst werden, die im selben Verzeichnis ausgeführt werden, und Sie können diese nicht steuern. Behandeln Sie die Reihenfolge als zufällig und sortieren Sie die Dinge bei Bedarf selbst.

Nein, readdir garantiert keine Bestellung.

(Einige Dateisysteme speichern Verzeichniseinträge möglicherweise in einer bestimmten Reihenfolge, in solchen Fällen gibt readdir sie möglicherweise in derselben Reihenfolge an Sie zurück, aber das ist keine Funktion von readdir selbst.)

Benutzeravatar von Ôrel
Ôrel

readdir() garantiert keine andere Reihenfolge als die Lesereihenfolge der Betriebssystemfestplatte.


Laut Test, den ich auf einigen Plattformen – Solaris – sun4sol, x86 sol, linux, Windows mit dem Beispielcode durchgeführt habe, wurden alle Ergebnisse zufällig angezeigt.


Quelle: readdir() beginnend mit Punkten statt Dateien

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

Benutzeravatar von Déjà vu
Déjà-vu

Zusätzlich zu den anderen Antworten, die readdir Manpage ist ziemlich klar über die Reihenfolge der Dateien.

Die Reihenfolge, in der Dateinamen durch aufeinanderfolgende Aufrufe von readdir() gelesen werden, hängt von der Implementierung des Dateisystems ab; Es ist unwahrscheinlich, dass die Namen in irgendeiner Weise sortiert werden.

Einige Dateisysteme, wie ReiserFS, listen die Dateien in lexikalischer Reihenfolge auf.

In Ihrem Fall müssen Sie die Namen in einem Array speichern und dann das Array sortieren.

Verwenden Sie zum Beispiel qsort() um das Array zu sortieren.

1412280cookie-checkGarantiert readdir() eine Bestellung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy