Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DateTime of a Directory (https://www.delphipraxis.net/189856-datetime-directory.html)

tcoman 31. Jul 2016 13:48

DateTime of a Directory
 
Hallo liebe DP-Gemeinde,

wenn ich das Datum einer Datei brauchte, verwendete ich bis
jetzt immer diese Funktion:
Delphi-Quellcode:
{-0920-} function mz_GetFileDateTime(myFile: string): s_48;
         var dt : integer;
         begin
         dt:=FileAge(myFile);
         try   result:=FormatDateTime('dd/mm/yyyy - hh:nn:ss',
                                       FileDateToDateTime(dt));
         except result:='';
         end;  {except}
{-0920-} end;
wobei myFile = "x:\dir\filename.ext" war.

Nun habe ich aber ein Verzeichnis und so steht
in myFile = "x:\dir". Die Funktion FileAge() liefert -1 zurueck
und ich bekomme einen Fehler.

Wie kann ich die DateTime eines Verzeichnisses bekommen?

MfG,
Terence

dGeek 31. Jul 2016 14:03

AW: DateTime of a Directory
 
SwissCelphiCenter sagt so...
http://www.swissdelphicenter.ch/de/showcode.php?id=855

nahpets 31. Jul 2016 14:08

AW: DateTime of a Directory
 
Delphi-Quellcode:
function mz_GetDirectoryDateTime(myDir : string): s_48; // Das wird wohl ein String sein(?)
var
  sr : TSearchRec;
begin
  if SysUtils.FindFirst(myDir,faDirectory,sr) = 0 Then begin
    Result := DateTimeToStr(FileDateToDateTime(sr.Time));
  end;
  SysUtils.FindClose(sr);
end;
Nur hingedaddelt, nicht getestet.

tcoman 31. Jul 2016 14:32

AW: DateTime of a Directory
 
Ich habe jetzt eine Loesung die funktioniert:
Delphi-Quellcode:
{-0891-} function mz_GetDirDateTime(myDir: string): s_48;
         var SR : TSearchRec;
         begin
         result:='00.00.0000 - 00:00:00';
         {-none ending backslash in string myDir: "X:\DIR"-}
         if (FindFirst(myDir, faDirectory, SR) = 0) then begin
            try   result:=FormatDateTime('dd/mm/yyyy - hh:nn:ss',
                                          FileDateToDateTime(SR.Time));
            except result:='00.00.0000 - 00:00:00';
            end;  {except}
            FindClose(SR);
         end;
{-0891-} end;
hatte das Problem schon mal geloest, dachte aber, dass ich
mit dt:=FileAge(myFile); weiterkomme, wenn ich ein "\." an
die Stringvariable myFile anhaenge, was aber nicht funktioniert.

Danke fuer die vielen schnellen Antworten...
@nahpets: Ist genau das, was Du vorgeschlagen hast.
MfG,
Terence

himitsu 31. Jul 2016 14:41

AW: DateTime of a Directory
 
Zitat:

Zitat von tcoman (Beitrag 1343837)
wenn ich das Datum einer Datei brauchte, ...

DAS?
Welches?

Erstellungs-Datum (wann die Datei auf dem Datenträger (Partition) erstellt/draufkopiert wurde.
Zeitpunkt des letzten Schreibzugriffs
Zeitpunkt des letzten Lesezugriffs

Und bei Verzeichnissen gibt es diese Daten auch, aber was da drin steht, das hängt vom Dateisystem/DateisystemTreiber/Betriebssystemversion und den Einstellungen ab.
Lesezugriff kann man bei Verzeichnissen vergessen
Schreibzugriff, da wird von von NTFS gern auch der letzte Schreib-/Löschzugriff der enthaltenen Dateien übernommen, also wann sich zuletzt an den Dateien was änderte, aber das hängt davon ab, ob es ein Wechseldatenträger ist, ob der Schreibcache aktiv ist und ob es sich um einen Flash-Speicher (USB-Stick oder SSD) handelt, denn da versucht Windows die Schreibzugriffe zu minimieren und dann ist das Datum/Uhrzeit weniger genau oder wird garnicht aktualisiert.

t.roller 31. Jul 2016 14:57

AW: DateTime of a Directory
 
GetDirTime

Delphi-Quellcode:
function GetDirTime(const Dir: string): TDateTime;
var
  H: Integer;
  F: TFileTime;
  S: TSystemTime;
begin
  H := CreateFile(PChar(Dir), $0080, 0, nil, OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS, 0);
  if H <> -1 then
  begin
    GetFileTime(H, @F, nil, nil);
    FileTimeToLocalFileTime(F, F);
    FileTimeToSystemTime(F, S);
    Result := SystemTimeToDateTime(S);
    CloseHandle(H);
  end
  else
    Result := -1;
end;
//ShowMessage(DateTimeToStr(GetDirTime('c:\Program Files')));

himitsu 31. Jul 2016 15:08

AW: DateTime of a Directory
 
Wozu FILE_FLAG_BACKUP_SEMANTICS und was ist, wenn die Rechte dafür fehlen?

Wer weiß auch aus dem Kopf, dass $0080 eigentlich FILE_READ_ATTRIBUTES darstellen soll?
Oder das erste -1 ein INVALID_HANDLE_VALUE, abgesehn davon, dass typbedingt -1 falsch ist und wenn schon, es ein 4294967295 oder DWORD(-1) sein müsste, da es z.B. in Win64 eventuell Problemchen geben könnte?

Fehlerbehandlung von GetFileTime ... na ja ... wenn das korrekt arbeitet, dann ist im Fehlerfall F nicht initialisiert.

PS: zu meinem letzten Post ... siehe Remarks in MSDN-Library durchsuchenGetFileTime.

tcoman 1. Aug 2016 16:41

AW: DateTime of a Directory
 
Zitat:

Zitat von t.roller (Beitrag 1343844)
GetDirTime

Delphi-Quellcode:
function GetDirTime(const Dir: string): TDateTime;
var
  H: Integer;
  F: TFileTime;
  S: TSystemTime;
begin
  H := CreateFile(PChar(Dir), $0080, 0, nil, OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS, 0);
  if H <> -1 then
  begin
    GetFileTime(H, @F, nil, nil);
    FileTimeToLocalFileTime(F, F);
    FileTimeToSystemTime(F, S);
    Result := SystemTimeToDateTime(S);
    CloseHandle(H);
  end
  else
    Result := -1;
end;
//ShowMessage(DateTimeToStr(GetDirTime('c:\Program Files')));

Wow! Really amazing code. Lots of thanks,
Terence

tcoman 1. Aug 2016 16:43

AW: DateTime of a Directory
 
Zitat:

Zitat von himitsu (Beitrag 1343846)
Wozu FILE_FLAG_BACKUP_SEMANTICS und was ist, wenn die Rechte dafür fehlen?

Wer weiß auch aus dem Kopf, dass $0080 eigentlich FILE_READ_ATTRIBUTES darstellen soll?
Oder das erste -1 ein INVALID_HANDLE_VALUE, abgesehn davon, dass typbedingt -1 falsch ist und wenn schon, es ein 4294967295 oder DWORD(-1) sein müsste, da es z.B. in Win64 eventuell Problemchen geben könnte?

Fehlerbehandlung von GetFileTime ... na ja ... wenn das korrekt arbeitet, dann ist im Fehlerfall F nicht initialisiert.

PS: zu meinem letzten Post ... siehe Remarks in MSDN-Library durchsuchenGetFileTime.

That's the difference between computer science and me, a fool.
Du bist echt gut, Himitsu.
MfG,
Terence

himitsu 1. Aug 2016 17:41

AW: DateTime of a Directory
 
Wenn man genug Fehler gemacht hat, dann kennt man die irgendwann auswendig. :lol:

Mit den "richtigen" Typen/Konstanten wird der Code leichter lesbar, verständlicher (auch ohne Kommentare an jeder Zeile) und hat auch beim Wechsel des Compilers weniger Problemchen.
Und mit einer entsprechenden Fehlerbehandlung muß man später weniger Angst vor unauffindbaren Fehlern haben, die sich immer liebendgern in Programme einschleichen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:58 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