2010-11-26 7 views
25

Ich brauche eine Liste von Dateien in einem Ordner und die Dateien werden mit ihrer geänderten Datum Uhrzeit sortiert.Wie bekomme ich eine Liste von Dateien in einem Ordner, in dem die Dateien mit geänderten Datum sortiert sind

Ich arbeite mit C++ unter Linux, die Boost-Bibliothek wird unterstützt.

Könnte mir bitte jemand eine Beispielcode zur Verfügung stellen, wie man das implementiert?

+2

Wie unterscheidet sich das von Ihrer anderen Frage: http://stackoverflow.com/questions/4279164/cboost-file-system-to-return-a-list-of-files-older-than-a-specific- Zeit? Nabulke hat Ihnen eine Antwort gegeben, die Sie in die richtige Richtung weisen sollte. Von dort ist es nicht schwer, die Dateien einem Vektor hinzuzufügen und sie zu sortieren. – Ralf

+0

Mögliches Duplikat von [C++: Boost-Dateisystem, um eine Liste von Dateien zurückzugeben, die älter als eine bestimmte Zeit sind] (https://stackoverflow.com/questions/4279164/cboost-file-system-to-return-a-list-of -files-old-than-a-specific-time) – halfer

Antwort

48

Die meisten Betriebssysteme geben keine Verzeichniseinträge in einer bestimmten Reihenfolge zurück. Wenn Sie sie sortieren möchten (Sie sollten es wahrscheinlich tun, wenn Sie die Ergebnisse einem menschlichen Benutzer zeigen), müssen Sie dies in einem separaten Durchlauf tun. Eine Möglichkeit, die Sie tun können, ist die Einträge in eine std::multimap einzufügen, so etwas wie so:

namespace fs = boost::filesystem; 
fs::path someDir("/path/to/somewhere"); 
fs::directory_iterator end_iter; 

typedef std::multimap<std::time_t, fs::path> result_set_t; 
result_set_t result_set; 

if (fs::exists(someDir) && fs::is_directory(someDir)) 
{ 
    for(fs::directory_iterator dir_iter(someDir) ; dir_iter != end_iter ; ++dir_iter) 
    { 
    if (fs::is_regular_file(dir_iter->status())) 
    { 
     result_set.insert(result_set_t::value_type(fs::last_write_time(dir_iter->path()), *dir_iter)); 
    } 
    } 
} 

Sie können dann durch result_set laufen, und die abgebildeten boost::filesystem::path Einträge werden in aufsteigender Reihenfolge.

+0

nur ein Hinweis hier, wenn Dateien innerhalb einer Sekunde erstellt/geändert werden, ist ihre Reihenfolge nicht garantiert, da 'std :: time_t 'auf die Sekunde genau ist. – fduff

+2

Bitte beachten Sie http://www.boost.org/doc/libs/1_46_1/libs/filesystem/v3/doc/reference.html#last_write_time. last_write_time erhält Pfad nicht Status. fs :: last_write_time (dir_iter-> Pfad()) – e271p314

+0

Sie fehlen eine linke Klammer in der result_set.insert ... – daramarak

Verwandte Themen