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.