![]() |
Erstellungsdatum eines Verzeichnis ermitteln?
Hallo DP,
wie kann ich das Erstellungsdatum eines Verzeichnisses ermitteln? Ich habe es schon mit ![]() Allerdings gibt diese mir für z.B. 'C:\Windows' ein Erstellungsdatum von '21.01.1617 02:16:40' zurück. Und das erscheint mir ein wenig unrealistisch. :zwinker: auch
Delphi-Quellcode:
bringt kein korrektes Ergebnis.
if FindFirst('C:\Windows',faDirectory,sr) = 0 then
dtCreate := FileDateToDateTime(sr.Time); Hat einer ne Idee? Danke und Grüße gmc |
Re: Erstellungsdatum eines Verzeichnis ermitteln?
Sicher das bei dir das Datum stimmt?
(z.B. Fehler im Dateisystem) Funktionieren sollte jedenfalls beides. was sagt denn der Explorer dazu? (Datei-/Verzeichniseigenschafften und hast du es auch mal mit anderen Dateien/Verzeichnissen versucht?) welchen Wert hat sr.Time bzw. Info1? gibt ![]() |
Re: Erstellungsdatum eines Verzeichnis ermitteln?
welches Dateisystem wird verwendet?
|
Re: Erstellungsdatum eines Verzeichnis ermitteln?
Dateisystem: NTFS
Soll das heißen ich komme mit FAT, FAT32 oder SMB in Schwierigkeiten? Na Toll. :? Das Datum laut Explorer von 'c:\Windows' stimmt ... nehme ich an. Jedesfalls ist es plausibel. Auch andere Verzeichnis geben mir mit ![]() zb.: Info1.dwLowDateTime = 21 Info2.dwHighDateTime = 19 :gruebel: nur anfangen kann ich damit nichts. irgendwie wird Info1 auch nicht gefüllt, denn es hat die gleichen Werte nach dem Aufruf von API-GetFileTime, wie danach. sr.Time gibt mir das Änderungsdatum zurück. Das nützt mir aber nichts. |
Re: Erstellungsdatum eines Verzeichnis ermitteln?
Zitat:
|
Re: Erstellungsdatum eines Verzeichnis ermitteln?
Hallo,
bei mir funktioniert das scheinbar:
Delphi-Quellcode:
Grüße vom marabu
function FileCreated(fn: TFileName): TDateTime;
var sr: TSearchRec; tzi: TTimeZoneInformation; lt, st: TSystemTime; begin if FindFirst(fn, faAnyFile, sr) = 0 then begin GetTimeZoneInformation(tzi); FileTimeToSystemTime(sr.FindData.ftCreationTime, st); SystemTimeToTzSpecificLocalTime(@tzi, st, lt); Result := SystemTimeToDateTime(lt); FindClose(sr); end else Result := 0; end; |
Re: Erstellungsdatum eines Verzeichnis ermitteln?
Liste der Anhänge anzeigen (Anzahl: 1)
also mit FindFirst oder der zugehörigen WinAPI (FindFirstFile) sollte es dennoch funktionieren.
um GetFileTime verwenden zu können muß das Verzeichnis geöffnet werden und z.B. ohne nötige Backuprechte geht dieses nicht so einfach. was sagt'n der Anhang? hab da direkt die WinAPI angesprochen, aber mit allem anderem, was auf diese aufbaut, sollte es genauso gehn.
Delphi-Quellcode:
Program Project1;
{$APPTYPE CONSOLE} Uses Windows, SysUtils; Var S: String; H: THandle; FT: TFileTime; ST: TSystemTime; FD: WIN32_FIND_DATA; Begin S := 'C:\Windows'; WriteLn(S); WriteLn; WriteLn('CreateFile>GetFileTime:'); H := CreateFile(PChar(S), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); If H <> INVALID_HANDLE_VALUE Then Begin GetFileTime(H, @FT, nil, nil); If FileTimeToSystemTime(FT, ST) Then Begin WriteLn(DateTimeToStr(SystemTimeToDateTime(ST)) + ' GMT'); End Else WriteLn('"' + S + '" > ungueltiges Datum'); CloseHandle(H); End Else WriteLn('"' + S + '" nicht gefunden oder kein Zugriff'); WriteLn('>' + SysErrorMessage(GetLastError)); WriteLn; WriteLn('FindFirstFile:'); H := FindFirstFile(PChar(S), FD); If H <> INVALID_HANDLE_VALUE Then Begin If FileTimeToSystemTime(FD.ftCreationTime, ST) Then Begin WriteLn(DateTimeToStr(SystemTimeToDateTime(ST)) + ' GMT'); End Else WriteLn('"' + S + '" > ungueltiges Datum'); FindClose(H); End Else WriteLn('"' + S + '" nicht gefunden'); WriteLn('>' + SysErrorMessage(GetLastError)); WriteLn; WriteLn; S := 'C:\Windows\Win.ini'; WriteLn(S); WriteLn; WriteLn('CreateFile>GetFileTime:'); H := CreateFile(PChar(S), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); If H <> INVALID_HANDLE_VALUE Then Begin GetFileTime(H, @FT, nil, nil); If FileTimeToSystemTime(FT, ST) Then Begin WriteLn(DateTimeToStr(SystemTimeToDateTime(ST)) + ' GMT'); End Else WriteLn('"' + S + '" > ungueltiges Datum'); CloseHandle(H); End Else WriteLn('"' + S + '" nicht gefunden oder kein Zugriff'); WriteLn('>' + SysErrorMessage(GetLastError)); WriteLn; WriteLn('FindFirstFile:'); H := FindFirstFile(PChar(S), FD); If H <> INVALID_HANDLE_VALUE Then Begin If FileTimeToSystemTime(FD.ftCreationTime, ST) Then Begin WriteLn(DateTimeToStr(SystemTimeToDateTime(ST)) + ' GMT'); End Else WriteLn('"' + S + '" > ungueltiges Datum'); FindClose(H); End Else WriteLn('"' + S + '" nicht gefunden'); WriteLn('>' + SysErrorMessage(GetLastError)); WriteLn; WriteLn; WriteLn('weiter mit [Enter]'); ReadLn; End. |
Re: Erstellungsdatum eines Verzeichnis ermitteln?
Hallo marabu,
deine Funktion funktioniert korrekt für mein 'c:\windows'. Sie gibt mir das korrekte Datum '28. 01. 2004 11:54:54' zurück. Zumindest weißt auch der Explorer das auch so aus. Bei einem weiterem Test-Verzeichnis (erstellt am '21.06.2007 17:48:37') unterscheidet sich das Datum, genauer, die Zeit um eine Stunde. Es wird eine Stunde später angezeigt ('18:48:37') als im Explorer. Vermutlich hat es etwas mit Winder- und Sommerzeit zu tun, denn das Windows-Verzeichnis ist (wie man sehen kann) zur Winterzeit angelegt und mein Test-Verzeichnis zur Sommerzeit. Nun bleibt die Frage, ob man das mit
Delphi-Quellcode:
korrekt erschlagen kann.
//aus DP-Lib GetFileTimes:
if GetTimeZoneInformation(TimeZoneInfo) <> $FFFFFFFF then Bias := TimeZoneInfo.Bias / 1440; // 60x24 GetFileTime(h, @Info1, @Info2, @Info3); if FileTimeToSystemTime(Info1, SysTimeStruct) then Created := SystemTimeToDateTime(SysTimeStruct) - Bias; Werde ich mal testen, denn stutzig macht mich himitsu Test-Programm-Ausgabe, die ebenfalls eine Stunde falsch liegt. Allerdings eine Stunde zu früh, in beiden fällen 'C:\Windows' und 'C:\Windows\Win.ini'. Hallo himitsu Ausgabe Projekt1.exe:
Code:
Auch mein Test-Verzeichnis, welches auch mit marabu's Funktion nicht korrekt ermittelt wird, wird hier eine Stunde zu früh angezeigt (21.06.2007 16:48:37). Das sind schon 2 Stunden Differenz. :shock:
D:\Temp>Project1.exe
C:\Windows CreateFile>GetFileTime: "C:\Windows" nicht gefunden oder kein Zugriff >Zugriff verweigert FindFirstFile: 28.01.2004 10:54:54 GMT >Zugriff verweigert C:\Windows\Win.ini CreateFile>GetFileTime: 18.08.2001 19:00:00 GMT >Der Vorgang wurde erfolgreich beendet FindFirstFile: 18.08.2001 19:00:00 GMT >Der Vorgang wurde erfolgreich beendet weiter mit [Enter] Okay, die Zeiten sind in GMT angegeben, aber das Winter- Sommerzeit-, allgemein das Zeitzonen-Problem weiß ich nicht zu lösen. Dafür bin ich irgendwie zu blöde. :oops: Zu guter Letzt bleibt noch die Frage, warum die verwendete API-Funktion GetFileTime in himitsu's Code einen zumindest plausiblen Wert zurück bringt und in der DP-Lib-GetFileTimes nicht? :gruebel: Die GetFileTimes-Funktion funktioniert für Dateien problemlos, nur mit Verzeichnisse macht mir die Funktion Schwierigkeiten. Danke und Grüße gmc |
Re: Erstellungsdatum eines Verzeichnis ermitteln?
Was noch zu beachten ist:
in NTFS werden die Zeiten als UTC gespeichert, wärend in FAT(12/16/32) die LocalTime gespeichert wird. Leider beachten die FAT-Dateisystemtreiber dieses nicht, wärend Windows und/oder der NTFS-Treiber da schon etwas rumrechnet. Also schön aufpassen auf welchem Dateisystem man sich grad befindet. |
Re: Erstellungsdatum eines Verzeichnis ermitteln?
Verzeiht mein Quereinsteigen,
ich suche gerade zum gleichen Thema und habe marabus Code ausprobiert: Dabei entdeckte ich einen, schon früher mit anderen Programmen bemerkten Fehler: Datum und Zeit werden mit Attribut, welches von ftCreationTime ausgelesen wird, nicht richtig wiedergegeben. Die Aufnahmezeiten, die ich mit ftCreationTime auslese entsprechen nicht dem Zeitpunkt, zu dem die Foto gemacht wurden, sondern dem Zeitpunkt, zu dem die Fotos auf den Rechner überspielt wurden. Das richtige korrekte Fotoaufnahmedatum lese ich mit ftLastWriteTime aus, also fälschlicherweise mit dem befehl, der das letzte Schreiben des Bildfiles tituliert (also dem Zeitstamp beim Kopieren). Diese Beobachtung habe ich schon mit dem Fotoprogramm ACDSee gemacht, als ich die zu importierenden Fotos mit dem Aufnahmedatum umbenennen wollte. ACDSee benannte dann die Fotos nicht mit dem AufnahmeDatum um sondern mit dem Änderungs (also dem Zeitstämp des Importierens) um. Ebenfalls die Verzeichnisnamen in der ACDSee Datenbank haben nicht das AufnahmeDatum sondern den ImportDatum zum Namen. In ACDSee werden die richtigen Bildnamen erst durch die Umbenennungsfunktion nach Änderungsdatum beim Importieren richtig benannt. Fazit der ganzen Beobachtung: AufnahmeDatum und Änderungsdatum sind in den jpg-BildHeadern vertauscht. Diese gilt sowohl für XP home und Vista. Dieses also eine Bug-Vermutung. Viele Grüße E. B. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz