Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Erstellungsdatum eines Verzeichnis ermitteln? (https://www.delphipraxis.net/107305-erstellungsdatum-eines-verzeichnis-ermitteln.html)

gmc616 25. Jan 2008 14:34


Erstellungsdatum eines Verzeichnis ermitteln?
 
Hallo DP,

wie kann ich das Erstellungsdatum eines Verzeichnisses ermitteln?

Ich habe es schon mit dieser Funktion probiert.
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:
if FindFirst('C:\Windows',faDirectory,sr) = 0 then
    dtCreate := FileDateToDateTime(sr.Time);
bringt kein korrektes Ergebnis.

Hat einer ne Idee?

Danke und Grüße

gmc

himitsu 25. Jan 2008 15:00

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 MSDN-Library durchsuchenGetFileTime irgendwelche Fehler(meldungen) zurück? (Result und GetLastError)

SirThornberry 25. Jan 2008 15:11

Re: Erstellungsdatum eines Verzeichnis ermitteln?
 
welches Dateisystem wird verwendet?

gmc616 25. Jan 2008 17:16

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 GetFileTimes (aus der DP-Codelibrary) ein falsches Datum zurück. Im Explorer sind sie korrekt.

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.

DeddyH 25. Jan 2008 17:43

Re: Erstellungsdatum eines Verzeichnis ermitteln?
 
Zitat:

Zitat von gmc616
sr.Time gibt mir das Änderungsdatum zurück. Das nützt mir aber nichts.

Falls sr ein TSearchRec ist (der Name lässt ja schon darauf schließen), dann wirf mal einen Blick in sr.FindData.

marabu 25. Jan 2008 17:54

Re: Erstellungsdatum eines Verzeichnis ermitteln?
 
Hallo,

bei mir funktioniert das scheinbar:

Delphi-Quellcode:
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;
Grüße vom marabu

himitsu 25. Jan 2008 18:32

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.

gmc616 28. Jan 2008 13:55

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:
//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;
korrekt erschlagen kann.
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:
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]
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:

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

himitsu 28. Jan 2008 14:32

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.

EccoBravo 28. Apr 2008 12:35

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 07:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz