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!