boost recursive_directory_iterator Frage



  • Hallo,

    ich hätte zwei Fragen zu dem boost::filesystem::recursive_directory_iterator:

    • Ist es immer so (bzw. garantiert) dass der directory iterator zuerst über Dateien und dann erst über directories in einem directory iteriert? Bei meinen Tests (z.B. ein Ordner mit 5 Dateien und 3 Ordnern) wurde nämlich immer zuerst über die Dateien und dann über die Ordner iteriert. Kann man sich darauf verlassen?
    • Falls der erste Punkt zutrifft, kann man die Reihenfolge auch ändern? Also zuerst directories und dann Dateien?

    Falls die erste Frage nicht zutrifft, wie wäre das am einfachsten zu bewerkstelligen (bevorzugt mit boost::filesystem )?

    Was ich will ist zuerst über alle directories in einem directory iterieren, dann über alle files in diesem directory. Das ganze noch in alphabetischer Reihenfolge.


  • Mod

    Merkwürdig. Das Verhalten scheint nicht mit dem übereinzustimmen, was die Doku vorgibt:

    The behavior of a recursive_directory_iterator is the same as a directory_iterator unless otherwise specified.

    Incrementing a recursive_directory_iterator pointing to a directory causes that directory itself to be iterated over, as specified by the operator++ and increment functions.

    Der directory_iterator sollte aber sicherlich alles in alphabetischer Reihenfolge passieren?



  • Arcoth schrieb:

    Merkwürdig. Das Verhalten scheint nicht mit dem übereinzustimmen, was die Doku vorgibt:

    The behavior of a recursive_directory_iterator is the same as a directory_iterator unless otherwise specified.

    Incrementing a recursive_directory_iterator pointing to a directory causes that directory itself to be iterated over, as specified by the operator++ and increment functions.

    Hm, ich seh da grade den Widerspruch nicht? Angenommen ich hab so eine Ordnerstruktur:

    Folder1
      File1
      File2
      File3
      Folder2
        File4
        File5
        Folder3
          File6
          File7
    

    Dann ist die Ausgabe für folgenden Code:

    #include <iostream>
    #include <boost\filesystem.hpp>
    
    int main()
    {
        boost::filesystem::recursive_directory_iterator dir("path to directory"), end;
        while (dir != end)
        {
            std::cout << dir->path().filename() << "\n";
            ++dir;
        }
    }
    

    diese:

    File1
    File2
    File3
    Folder2
    File4
    File5
    Folder3
    File6
    File7
    

    Also zuerst files, dann directories.

    Arcoth schrieb:

    Der directory_iterator sollte aber sicherlich alles in alphabetischer Reihenfolge passieren?

    Ja, das schon, aber ist das auch irgendwie garantiert so dass man sich darauf verlassen kann? Ich kann dazu nämlich nichts finden in der Doku...



  • Es ist imo NICHT garantiert, dass die Dateien in alphabetischer Reihenfolge ermittelt werden. Zumindest unter Microsoft-Betriebssystemen nicht.
    Darüber bin ich vor kurzem gestolpert, da in einer Anwendung von mir Dateien in alphabetischer Reihenfolge bearbeitet werden sollten, und es einen Fall gab, wo es nicht alphabetisch war.
    Ich hatte mir dabei die Windows-Implementation des recursive_directory_iterators angeschaut. Intern wird FindFirstFile und FindNextFile genutzt.

    Zu FindNextFile steht folgendes bei MSDN:

    The order in which this function returns the file names is dependent on the file system type. With the NTFS file system and CDFS file systems, the names are usually returned in alphabetical order. With FAT file systems, the names are usually returned in the order the files were written to the disk, which may or may not be in alphabetical order. However, as stated previously, these behaviors are not guaranteed.

    Siehe https://msdn.microsoft.com/de-de/library/windows/desktop/aa364428(v=vs.85).aspx

    Meine Lösung war dabei, die Dateien zu sammeln, alphabetisch zu sortieren und dann zu bearbeiten. Vielleicht kennt hier jemand eine bessere Lösung.

    Zur anderen Frage (Ordner oder Dateien zuerst) kann ich nichts sagen.



  • BoostFilesystemUser schrieb:

    Es ist imo NICHT garantiert, dass die Dateien in alphabetischer Reihenfolge ermittelt werden. Zumindest unter Microsoft-Betriebssystemen nicht.
    Darüber bin ich vor kurzem gestolpert, da in einer Anwendung von mir Dateien in alphabetischer Reihenfolge bearbeitet werden sollten, und es einen Fall gab, wo es nicht alphabetisch war.
    Ich hatte mir dabei die Windows-Implementation des recursive_directory_iterators angeschaut. Intern wird FindFirstFile und FindNextFile genutzt.

    Hm das ist ziemlich ärgerlich... aber Danke für die Info, dann werd ich es wohl auch manuell sortieren müssen.


  • Mod

    happystudent schrieb:

    Arcoth schrieb:

    Merkwürdig. Das Verhalten scheint nicht mit dem übereinzustimmen, was die Doku vorgibt:

    The behavior of a recursive_directory_iterator is the same as a directory_iterator unless otherwise specified.

    Incrementing a recursive_directory_iterator pointing to a directory causes that directory itself to be iterated over, as specified by the operator++ and increment functions.

    Hm, ich seh da grade den Widerspruch nicht?

    Du musst den nächsten Satz auch berücksichtigen.



  • Arcoth schrieb:

    Du musst den nächsten Satz auch berücksichtigen.

    Achso, dachte das war als zweiter Punkt gemeint 🤡


Anmelden zum Antworten