Einzelnen Beitrag anzeigen

necromundo

Registriert seit: 31. Jan 2005
26 Beiträge
 
#19

Re: Dateiattribute und -zeitstempel kopieren

  Alt 16. Apr 2009, 13:55
So, das Problem ist behoben!
Die Vermutung, dass das letzte Zugriffsdatum sofort geändert wird, wenn die Datei in irgendeiner Weise angepackt wird, hat sich bewahrheitet. Also gestaltet sich der Kopiervorgang einer Datei etwas schwieriger als vermutet, wenn man wirklich alle Zeitstempel beibehalten und auch auf die kopierte Datei übertragen will:

Ich habe eine Datenstruktur angelegt für die Zeitstempel:
Delphi-Quellcode:
TZeitstempel = record
    creation: TFileTime;
    lastchange: TFileTime;
    lastaccess: TFileTime;
  end;
Danach zwei Funktionen zum Ermitteln und Schreiben der Zeitstempel:

Delphi-Quellcode:
function getZeitstempel(datei: widestring): TZeitstempel;
var
  dates: TZeitstempel;
  h: THandle;
begin
  if datei[length(datei)] = '\then setlength(datei,length(datei)-1);
  h := CreateFileW(PWideChar(datei), $0080, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  GetFileTime(h, @dates.creation, @dates.lastchange, @dates.lastaccess);
  result := dates;
end;

function setZeitstempel(datei: widestring; daten: TZeitstempel): boolean;
var
  h: THandle;
begin
  if datei[length(datei)] = '\then setlength(datei,length(datei)-1);
  h := CreateFileW(PWideChar(datei), $0100, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  result := SetFileTime(h, @daten.creation, @daten.lastchange, @daten.lastaccess);
end;
Beim CreateFileW, das $0080 bedeutet FILE_READ_ATTRIBUTES und das §0100 FILE_WRITE_ATTRIBUTES, über das Handle kann also nur auf die Dateiattribute zugegriffen werden.

Und der Part mit dem eigentlichen Kopiervorgang sieht dann so aus:

Delphi-Quellcode:
tempzeitstempel := getzeitstempel(quelle);
copyfilew(pwidechar(quelle),pwidechar(ziel),false);
setzeitstempel(quelle,tempzeitstempel);
setzeitstempel(ziel,tempzeitstempel);
Damit ist das Problem gelöst!
  Mit Zitat antworten Zitat