3

我正在从我的服务器下载一个文件(我只获取 lastwritetime 属性的字节和 DateTime),下载数据后,我在本地机器上创建了一个新文件并想要设置 lastwritetime 属性。为此,我使用以下方法:

procedure SetFileDate(const FileName: string; NewDate: TDateTime);
var
    FileDate, FileHandle: Integer;
begin
    try
        FileDate := DateTimeToFileDate(NewDate);

        FileHandle := FileOpen(FileName, fmOpenReadWrite or fmShareDenyWrite);
        if FileHandle > 0 then
            begin
                FileSetDate(FileHandle, FileDate);
                FileClose(FileHandle);
            end;
    except
        begin
            // ERROR Log
            err.Msg('FileReqThrd.SetFileDate');
        end;
    end;
end;

对于“NewDate”参数,我使用从服务器获取的 DateTime。我尝试像这样从服务器转换 DateTime 以获得有效的 lastwritetime(我从 WCF 请求数据,这就是为什么我将其转换为 UTCDateTime,来自 WCF 服务的未触及数据是 TXSDateTime):

TDateTime cloudFileDateTime := StrToDateTime(DateTimeToStr(cloudDownloadResult.FileCloudData.Lastwritetime.AsUTCDateTime));

但最后我的 lastwritetime 属性来自在冬季期间具有 lastwritetime 的文件与-1h 是错误的。

我希望你能理解我的问题,并能告诉我如何解决它。

此致

4

2 回答 2

4

最简单的方法是TFile.SetLastWriteTimeUtcSystem.IOUtils单位呼叫。

TFile.SetLastWriteTimeUtc(FileName, 
    DateTimeUtc);

如果此函数不可用,请使用 Win32 API 函数SetFileTime

在那种情况下,您还需要DateTimeToSystemTime然后。SystemTimeToFileTime

于 2014-08-25T12:40:59.763 回答
0

David 提供的答案(使用TFile.SetLastWriteTimeUtc)是正确的。但是,评论中有一些关于错误的讨论。由于我无法发表评论(由于缺乏代表),我将在此处为将来遇到此问题的任何人添加此内容。

虽然 TFile.SetLastWriteTimeUtc 工作正常,但 TFile.GetLastWriteTimeUtc 确实存在与夏令时相关的错误。Embarcadero 提交了一个错误报告,看起来他们现在已经在 Delphi 10.3 Rio 中修复了它(尽管我还没有尝试过)。

如果您使用的是旧版本的 Delphi,则必须通过使用 Windows API 来解决该问题。例如GetFileAttributesEx

function GetFileModTimeUtc(filePath: string): TDateTime;
var data: TWin32FindData;
var sysTime: TSystemTime;
begin
  if GetFileAttributesEx(PChar(filePath), GetFileExInfoStandard, @data) and
      FileTimeToSystemTime(data.ftLastWriteTime, sysTime) then begin
    Result := SystemTimeToDateTime(sysTime);
  end else begin
    raise Exception.Create('Unable to get last file write time for ' + filePath);
  end;
end;
于 2018-11-22T23:24:02.077 回答