Komplettes Verzeichnis sortiert einlesen alte Dateien zuerst



  • Hallo,

    möchte ein komplettes Verzeichnis sortiert einlesen, die ältesten Dateien zuerst. Mit FindFirstFile gebastel bekomme Ich es nicht hin.

    Hat einer zufällig einen Snippet zur Hand?

    Hab die Suchfunktion/FAQ benutzt aber nichts passendes in der Richtung gefunden.



  • Wieso nicht der Ansatz ist doch ok? Du musst nur noch TSearchRec::Time auslesen und danach sortieren.



  • Eigentlich brauch Ich ja nur den FileName und das ftCreationTime in einer TList zu speichern. Mein Problem ist hauptsächlich Ich weiss nicht wie Ich das geschickt in einer TListe/Array speichere und dieses dann sortieren lassen kann.



  • Pack doch Dateiname und Datum in eine struct diese in eine TList oder einen vector. Neue Einträge würde ich direkt an der richtigen Stelle einfügen.



  • Hallo,

    Man könnte auch eine map verwenden und die Zeit als Key nehmen. Dann ist alles gleich sortiert.



  • Was mich daran erinnert, dass ich viel zu wenig mit dem 'Standard' arbeite... 😉



  • TStringList *dateien = new TStringList();
        map<AnsiString,TDateTime> mymap;
        map<AnsiString,TDateTime>::iterator it;
        pair<map<AnsiString,TDateTime>::iterator,bool> ret;
    
        do
        {
            FileTimeToLocalFileTime(&(sr.ftCreationTime), &filetime);
            FileTimeToSystemTime(&filetime, &sysTime);
            dtFileCreated = SystemTimeToDateTime(sysTime);
    
            mymap.insert ( pair<AnsiString,TDateTime>(sr.cFileName, dtFileCreated) );
        }
        while (FindNextFile(hFileHandle,&sr));
    

    und wie könnte ich das jetzt asc oder desc sortieren?



  • Hallo

    std::map ist immer nach dem erstem Argument sortiert. Wenn du nach dem Zeitstempel sortieren willst. must du natürlich die Map so definieren : map<TDateTime, AnsiString>

    bis bald
    akari



  • Hier die komplette funktionierende Funktion:

    gibt aus dem Verzeichnis alle *.jpg Dateien in einer TList zurück, sortiert nach Alter(älteste Dateien zuerst).

    TStringList* __fastcall TForm1::readDirectory(AnsiString dir)
    {
        AnsiString sFolderpath;
        HANDLE hFileHandle;
        WIN32_FIND_DATA sr;
    
        SYSTEMTIME sysTime;
        FILETIME filetime;
    
        TDateTime dtFileCreated;  // enthält Erstellungsdatum
    
        sFolderpath=dir+"\\*.jpg";
        hFileHandle=FindFirstFile(sFolderpath.c_str(),&sr);
    
        TStringList *dateien = new TStringList();
        map<TDateTime,AnsiString> mymap;
        map<TDateTime,AnsiString>::iterator it;
        pair<map<TDateTime,AnsiString>::iterator,bool> ret;
    
        do
        {
            FileTimeToLocalFileTime(&(sr.ftCreationTime), &filetime);
            FileTimeToSystemTime(&filetime, &sysTime);
            dtFileCreated = SystemTimeToDateTime(sysTime);
            mymap.insert ( pair<TDateTime,AnsiString>( dtFileCreated, sr.cFileName) );
        }
        while (FindNextFile(hFileHandle,&sr));
        FindClose(hFileHandle);
    
        for ( it=mymap.begin() ; it != mymap.end(); it++ )
            dateien->Add((*it).second);
    
        return dateien;
    }
    

    Danke fürs helfen! :p 😃 🙂



  • Nur mal als Frage. Wozu dient dieses ret?

    So wie du dein insert schreibst kannst du es auch durch

    mymap[dtFileCreated] = sr.cFileName;
    

    ersetzen (finde ich übersichtlicher).
    und statt

    (*it).second
    

    finde ich

    it->second
    

    schöner.



  • danke für die tips, stimmt "ret" macht eigentlich nichts, hab's vergessen rauszunehmen.


Anmelden zum Antworten