Änderungsdatum einer Datei ermitteln und ins DateTime Format konvertieren...
-
Hallo
Das kann man auch alles den entsprechenden Funktionen überlassen
Dazu must du nach dem Auslesen des Datums aus dem Struct erstmal die WinAPI-Funktion FileTimeToLocalFileTime anwenden. Danach wie gezeigt FileTimeToSystemTime. Zum Schluß die VCL-Funktion SystemTimeToDateTime.bis bald
akari
-
TSearchRec sr; int iAttributes = faAnyFile; SYSTEMTIME sysTime; GetLocalTime(&sysTime); TDateTime dtFileCreated; // enthält Erstellungsdatum TDateTime dtFileLastModified; // enthält Datum letzte Änderung if (FindFirst(FileName, iAttributes, sr) == 0) { FileTimeToSystemTime(&(sr.FindData.ftCreationTime), &sysTime); dtFileCreated = TDateTime(sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds) + TDateTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay); FileTimeToSystemTime(&(sr.FindData.ftLastWriteTime), &sysTime); dtFileLastModified = TDateTime(sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds) + TDateTime(sysTime.wYear, sysTime.wMonth, sysTime.wDay); } FindClose(sr); return dtFileLastModified;das hat mich auch net weiter gebracht -> GetLocalTime(&sysTime);
Ich weiss nicht wo Ich genau FileTimeToLocalFileTime anwenden soll?
-
ich vermute mal es sollte dann so aussehen...
TSearchRec sr; int iAttributes = faAnyFile; SYSTEMTIME sysTime; FILETIME filetime; TDateTime dtFileCreated; // enthält Erstellungsdatum TDateTime dtFileLastModified; // enthält Datum letzte Änderung if (FindFirst(FileName, iAttributes, sr) == 0) { FileTimeToLocalFileTime(&(sr.FindData.ftCreationTime), &filetime); FileTimeToSystemTime(&filetime, &sysTime); dtFileCreated = SystemTimeToDateTime(sysTime); FileTimeToLocalFileTime(&(sr.FindData.ftLastWriteTime), &filetime); FileTimeToSystemTime(&filetime, &sysTime); dtFileLastModified = SystemTimeToDateTime(sysTime); } FindClose(sr); return dtFileLastModified;
-
Linnea schrieb:
ich vermute mal es sollte dann so aussehen...
TSearchRec sr; int iAttributes = faAnyFile; SYSTEMTIME sysTime; FILETIME filetime; TDateTime dtFileCreated; // enthält Erstellungsdatum TDateTime dtFileLastModified; // enthält Datum letzte Änderung if (FindFirst(FileName, iAttributes, sr) == 0) { FileTimeToLocalFileTime(&(sr.FindData.ftCreationTime), &filetime); FileTimeToSystemTime(&filetime, &sysTime); dtFileCreated = SystemTimeToDateTime(sysTime); FileTimeToLocalFileTime(&(sr.FindData.ftLastWriteTime), &filetime); FileTimeToSystemTime(&filetime, &sysTime); dtFileLastModified = SystemTimeToDateTime(sysTime); } FindClose(sr); return dtFileLastModified;ja genau so
vielen dank an alle, ihr seid ne spitzen community, habt mich schon oft rausgerissen
!
-
Hallo
Anzumerken wäre noch das bei den WinAPI-Funktion noch das Rückgabeergebnis laut MSDN überprüft werden sollte, und dementsprechend auch eine Fehlerbehandlung eingebaut werden sollte.
bis bald
akari
-
Hi. Ich kram mal das Thema raus, da ich mich auch dafür interessiere. Wie genau funktioniert das mit der Prüfung des Rückgabeergebnisses? Auf -1 oder NULL wird dies wohl nicht bezoge sein. Habe mit WinAPI noch nicht allzuviel gemacht.

-
Hallo
Was die Rückgabewerte für die einzelnen Funktionen bedeuten kannst du in deren Beschreibung in der MSDN nachlesen. In den meisten Fällen ist es in der Tat eine Überprüfung auf 0 (bzw. false)
bis bald
akari
-
Ich meine, was soll drinstehen, wenn es nicht geklappt haben sollte, weil Beispielsweise FileName falsch war? Ich sehe in der Hilfe nirgends "Wenn kein Wert gefunden, dann gibt Funktion ein ??? zurück". Woher weiss ich nun auf was ich die Rückgabe TDateTime kontrollieren soll? Einfaches ausprobieren?

-
WinAPI-Funktionen geben fast immer 0 zurück wenn ein Fehler aufgetreten ist (wie akari schon sagte). Die Art des fehlers bekommt man dann meist mit GetLastError().
Schau doch einfach mal nach diesen Funktionen in der MSDN.
Bsp. http://msdn2.microsoft.com/en-us/library/ms724277.aspx
-
Hallo
Maiky schrieb:
Woher weiss ich nun auf was ich die Rückgabe TDateTime kontrollieren soll? Einfaches ausprobieren?

WinAPI-Funktionen geben garantiert kein TDateTime zurück. In deinem speziellen Fall must du eben mit der Fehlerbehandlung nicht erst anfangen wenn du ein TDateTime hast sondern schon wenn die WinAPi-Funktionen aufgerufen werden.
bis bald
akari
-
TDateTime __fastcall GetFileLastModified(AnsiString FileName) { TSearchRec sr; int iAttributes = faAnyFile; SYSTEMTIME sysTime; FILETIME filetime; TDateTime dtFileLastModified; if (FindFirst(FileName, iAttributes, sr)==0) { if (FileTimeToLocalFileTime(&(sr.FindData.ftLastWriteTime), &filetime)) { if (FileTimeToSystemTime(&filetime, &sysTime)!=0) { dtFileLastModified = SystemTimeToDateTime(sysTime); } } } FindClose(sr); return dtFileLastModified; }Und auf was und wie prüfe ich nun letztendlich die Rückgabe?
TDateTime test; Label1->Caption = test; // Ausgabe: 00:00:00Eigentlich ist test ja kein AnsiString.. bin etwas verwirrt wie ich das korrekt auswerten soll, oder darf ich wirklich if (test!="00:00:00") als Prüfung? Sieht komisch aus.

-
Intern wird Zeit und Datum in TDateTime als double repräsentiert. Es gibt aber noch einen Konvertierungsoperator für int. Es sollte also
if (test!=0)gehen.
Du kannst natürlich auch eine Exception werfen, wenn die Umwandlung nicht geht.
-
Also Frage ich entweder nach
if (int(test)!=0)oder
if (double(test)!=0)ab?
-
So wie ich es geschrieben habe sollte es reichen, ansonsten die erstere Variante.