Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Änderungsdatum ist seeehr merkwürdig (https://www.delphipraxis.net/73627-aenderungsdatum-ist-seeehr-merkwuerdig.html)

zebrafalke 20. Jul 2006 19:16


Änderungsdatum ist seeehr merkwürdig
 
Hallo, :-D
folgender Code soll den Inhalt eines Ordners auslesen, die gefundenen Dateien in einer Listbox darstellen und nach jeder gefundenen Datei eine Message mit Erstellungsdatum, letztes Zugriffsdatum, letzter Schreibzugriff und Dateinamen anzeigen.

Delphi-Quellcode:
function GetFileDate(const FileName: string; out Creation, LastAccess,
  LastWrite: TDateTime): Boolean;
var
  hFile: THandle;
  ftCreationUTC, ftLastAccessUTC, ftLastWriteUTC: TFileTime;
  ftCreationLocal, ftLastAccessLocal, ftLastWriteLocal: TFileTime;
  stCreationLocal, stLastAccessLocal, stLastWriteLocal: TSystemTime;
begin
  result:=false;
  hFile := CreateFile(PChar(FileName), GENERIC_READ, 0, nil,
  OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
  if (hFile <> INVALID_HANDLE_VALUE) then begin
    try
      //Ermittlung des Dateidatums in UTC (Weltzeit)
      if GetFileTime(hFile, @ftCreationUTC, @ftLastAccessUTC, @ftLastWriteUTC) then begin
        //Umrechnung in Ortszeit
        if FileTimeToLocalFileTime(ftCreationUTC, ftCreationLocal)
        and FileTimeToLocalFileTime(ftLastAccessUTC, ftLastAccessLocal)
        and FileTimeToLocalFileTime(ftLastWriteUTC, ftLastWriteLocal) then begin
          //Umwandlung in Systemdatumformat
          if FileTimeToSystemTime(ftCreationLocal, stCreationLocal)
          and FileTimeToSystemTime(ftLastAccessLocal, stLastAccessLocal)
          and FileTimeToSystemTime(ftLastWriteLocal, stLastWriteLocal) then begin
            //Zuweisung der Rückgabewerte
            Creation := SystemTimeToDateTime(stCreationLocal);
            LastAccess := SystemTimeToDateTime(stLastAccessLocal);
            LastWrite := SystemTimeToDateTime(stLastWriteLocal);
            result:=true;
          end;
        end;
      end;
    finally
      CloseHandle(hFile);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 FindFirst('C:\Dokumente und Einstellungen\mega\Eigene Dateien\Homepage' +
           '\*.*', faAnyFile, SearchRec);
  repeat
    ListBox1.items.add(searchrec.Name);
    GetFileDate(searchrec.Name, erstellung, zugriff, schreibzugriff);



    ShowMessage('Erstellung: '+DateTimeToStr(erstellung)+#13#10+'Letzter Zugriff: '+
  DateTimeToStr(zugriff)+#13#10+'Letzter Schreibzugriff: '+DateTimeToStr(schreibzugriff)+
  #12#10+'Dateiname: '+ searchrec.Name);
  until FindNext(searchrec) <> 0;
  findclose(searchrec);
end;
Das Problem ist, das er bei allen Daten, die er anzeigen soll, immer 30.12.1899 anzeigt! :roteyes:

Wie kann das sein? Soooo alt sind meine Daten nun auch wieder nicht.... :mrgreen:


Gruß zebrafalke

mkinzler 20. Jul 2006 19:27

Re: Änderungsdatum ist seeehr merkwürdig
 
Die variable hat wohl den wert 0 (was 30.12.1899) entspricht.

thkerkmann 20. Jul 2006 19:28

Re: Änderungsdatum ist seeehr merkwürdig
 
Hi,

das Problem ist, er findet deine Datei gar nicht....

Der Searchrec.name hält nicht den Verzeichnispfad, sondern nur den Dateinamen.
Du muss also deiner Funktion noch den Pfad voransetzen.

Du hast extra eine Funktion gebaut mit result = false/true, fragst aber das Ergebnis gar nicht ab.
Würdest Du das tun, könntest Du sehen, das immer false zurückkommt.

Übergebe mal GetFiledate (verzeichnis + searchrec.name,....) und prüfe das Ergebnis.

Gruss

Thomas

zebrafalke 20. Jul 2006 20:04

Re: Änderungsdatum ist seeehr merkwürdig
 
Jo, jetzt, funktionierts, danke! :thumb:

Warum erscheinen am Anfang der Listbox eigendlich immer zwei Einträge nur mit Punkten?

gruss

xaromz 20. Jul 2006 20:08

Re: Änderungsdatum ist seeehr merkwürdig
 
Hallo,
Zitat:

Zitat von zebrafalke
Warum erscheinen am Anfang der Listbox eigendlich immer zwei Einträge nur mit Punkten?

Kennst Du Dich mit Dateisystemen aus?
Der erste Eintrag (ein Punkt) steht für das aktuelle Verzeichnis.
Der zweite Eintrag (zwei Punkte) steht für das übergeordnete Verzeichnis.

Gruß
xaromz

zebrafalke 20. Jul 2006 20:13

Re: Änderungsdatum ist seeehr merkwürdig
 
Hmm, klingt logisch...wäre nurnoch die Frage, wie unterbinde ich das Auftreten dieser Punkte? :gruebel:

ErazerZ 20. Jul 2006 20:16

Re: Änderungsdatum ist seeehr merkwürdig
 
Delphi-Quellcode:
  if (Filename <> '.') and (Filename <> '..') then
  begin
    showmessage(filename);
  end;

zebrafalke 20. Jul 2006 20:25

Re: Änderungsdatum ist seeehr merkwürdig
 
Das geht leider nicht, er meint TSearchRec und String wären inkompatible Typen. Kann man nicht von vornherein verhindern, das die Punkte übergaupt erst auftauchen und sie halt nicht hinterher wegzumachen??? :gruebel: :gruebel: :gruebel:

3_of_8 20. Jul 2006 20:28

Re: Änderungsdatum ist seeehr merkwürdig
 
Nein, kann man nicht. Und:

if (searchrec.name<>'.') and (searchrec.name<>'..') then...

zebrafalke 20. Jul 2006 20:56

Re: Änderungsdatum ist seeehr merkwürdig
 
Vielen Dank, jetzt klappts! :-D :-D

Gruß
zebrafalke


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:19 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 by Thomas Breitkreuz