AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Erstellungsdatum eines Verzeichnis ermitteln?
Thema durchsuchen
Ansicht
Themen-Optionen

Erstellungsdatum eines Verzeichnis ermitteln?

Ein Thema von gmc616 · begonnen am 25. Jan 2008 · letzter Beitrag vom 28. Apr 2008
Antwort Antwort
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#1

Erstellungsdatum eines Verzeichnis ermitteln?

  Alt 25. Jan 2008, 14:34
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.

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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

Re: Erstellungsdatum eines Verzeichnis ermitteln?

  Alt 25. Jan 2008, 15:00
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Erstellungsdatum eines Verzeichnis ermitteln?

  Alt 25. Jan 2008, 15:11
welches Dateisystem wird verwendet?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Erstellungsdatum eines Verzeichnis ermitteln?

  Alt 25. Jan 2008, 17:16
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

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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Erstellungsdatum eines Verzeichnis ermitteln?

  Alt 25. Jan 2008, 17:43
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Erstellungsdatum eines Verzeichnis ermitteln?

  Alt 25. Jan 2008, 17:54
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#7

Re: Erstellungsdatum eines Verzeichnis ermitteln?

  Alt 25. Jan 2008, 18:32
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.
Angehängte Dateien
Dateityp: exe project1_768.exe (48,0 KB, 10x aufgerufen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
gmc616

Registriert seit: 25. Jun 2004
Ort: Jena
627 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Erstellungsdatum eines Verzeichnis ermitteln?

  Alt 28. Jan 2008, 13:55
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.

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.

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?
Die GetFileTimes-Funktion funktioniert für Dateien problemlos, nur mit Verzeichnisse macht mir die Funktion Schwierigkeiten.

Danke und Grüße
gmc
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#9

Re: Erstellungsdatum eines Verzeichnis ermitteln?

  Alt 28. Jan 2008, 14:32
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von EccoBravo
EccoBravo

Registriert seit: 19. Okt 2004
Ort: Neuruppin
524 Beiträge
 
Delphi 2007 Architect
 
#10

Re: Erstellungsdatum eines Verzeichnis ermitteln?

  Alt 28. Apr 2008, 12:35
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.
Wahre Aussage :=
Katzen, die bellen sind keine Kaninchen.

Der Kreisverkehr ist eine spezielle Form der Einbahnstraße
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:32 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