我想更正某些文件的最后访问时间。 对于某些文件,以编程方式执行此操作将失败一小时。 神秘,因为我确实根据时区更正了日期。
这里是一个示例,已针对Delphi2010(这是我需要的代码)和Delphi10.3进行了测试
function GetTempDir : string;
var path : array[0..MAX_PATH] of char;
PathStr : string;
begin
GetTempPath(MAX_PATH,path);
PathStr:=path;
result:=IncludeTrailingPathDelimiter(PathStr);
end;
function UTCDateTimeFromLocalDateTime(const LocalDateTime: TDateTime): TDateTime;
var
LocalSystemTime: TSystemTime;
UTCSystemTime: TSystemTime;
LocalFileTime: TFileTime;
UTcfileTime: TFileTime;
begin
DateTimeToSystemTime(LocalDateTime,UTCSystemTime);
SystemTimeToFileTime(UTCSystemTime,UTcfileTime);
if LocalFileTimeToFileTime(UTcfileTime,LocalFileTime)
and FileTimeToSystemTime(LocalFileTime,LocalSystemTime) then begin
Result := SystemTimeToDateTime(LocalSystemTime);
end else begin
Result := LocalDateTime;
end;
end;
function setfileTimesHelper(const FileName: string; DateTime: TDateTime): Boolean;
var
Handle: THandle;
FileTime: TFileTime;
SystemTime: TSystemTime;
begin
Result := False;
Handle := CreateFile(pchar(FileName),GENERIC_WRITE,FILE_SHARE_READ,nil,OPEN_EXISTING,0);
if Handle <> INVALID_HANDLE_VALUE then
try
DateTime:=UTCDateTimeFromLocalDateTime(DateTime);
DateTimeToSystemTime(DateTime,SystemTime);
FileTime.dwLowDateTime := 0;
FileTime.dwHighDateTime := 0;
if SystemTimeToFileTime(SystemTime,FileTime) then
begin
Result := setfileTime(Handle,@FileTime);
end;
finally
CloseHandle(Handle);
end;
end;
procedure TForm1.CreateDateFile(Dat : TDateTime);
var FileName : string;
begin
FileName:=GetTempDir+FormatDateTime('yyyymmdd hhnnss',Dat)+'.txt';
Memo1.Lines.Add(FileName);
with TStringList.Create do
begin
text:='1';
SaveToFile(FileName);
Free;
end;
setfileTimesHelper(FileName,Dat);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateDateFile(StrToDateTime('23.02.2013 11:11:11'));
CreateDateFile(StrToDateTime('06.05.2014 22:22:22')); // file dated 23:22:22
end;
第一个文件的日期正确,第二个文件在Windows资源管理器中显示为23:22:22。 我想念什么?