Delphi UTC支持比较2个文件的日期/时间

Delphi UTC支持比较2个文件的日期/时间,delphi,date,time,utc,Delphi,Date,Time,Utc,我有一个比较源文件和目标文件日期/时间的实用程序。这在大多数情况下都有效,但在比较不同时区中文件的日期/时间时失败。所以我需要一个UTC日期时间例程 环顾四周,Windows API GetFileTime似乎将支持这一点。我还发现了这个包装程序,但在Delphi2010下编译时,它在GetFileTime调用中崩溃 有什么想法吗?或者是否有人有一段处理UTC时区等的代码,我可以将两个文件名传递给他们,告诉我它们是否不同 function CompareFileTimes(File1, File

我有一个比较源文件和目标文件日期/时间的实用程序。这在大多数情况下都有效,但在比较不同时区中文件的日期/时间时失败。所以我需要一个UTC日期时间例程

环顾四周,Windows API GetFileTime似乎将支持这一点。我还发现了这个包装程序,但在Delphi2010下编译时,它在GetFileTime调用中崩溃

有什么想法吗?或者是否有人有一段处理UTC时区等的代码,我可以将两个文件名传递给他们,告诉我它们是否不同

function CompareFileTimes(File1, File2 : String) : LongInt;
var
  F1, F2          : THandle;
  F1_CreateTime,
  F1_LastAccess,
  F1_LastWrite,
  F2_CreateTime,
  F2_LastAccess,
  F2_LastWrite    : PFileTime;
begin
  //Initialize all variables
  F1 := 0;
  F2 := 0;

  //Since these are pointers, we have to
  //allocate memory for the FileTime structures
  GetMem(F1_CreateTime, SizeOf(TFileTime));
  GetMem(F1_LastAccess, SizeOf(TFileTime));
  GetMem(F1_LastWrite, SizeOf(TFileTime));
  GetMem(F2_CreateTime, SizeOf(TFileTime));
  GetMem(F2_LastAccess, SizeOf(TFileTime));
  GetMem(F2_LastWrite, SizeOf(TFileTime));

  //Fill the structures with nulls for now
  FillChar(F1_CreateTime, SizeOf(TFileTime), #0);
  FillChar(F1_LastAccess, SizeOf(TFileTime), #0);
  FillChar(F1_LastWrite, SizeOf(TFileTime), #0);
  FillChar(F2_CreateTime, SizeOf(TFileTime), #0);
  FillChar(F2_LastAccess, SizeOf(TFileTime), #0);
  FillChar(F2_LastWrite, SizeOf(TFileTime), #0);

  //Get file handles for the files in question
  //Notice that even though we're using CreateFile
  //the open disposition for the file is OPEN_EXISTING
  F1 := CreateFile(PChar(F1), 0, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  F2 := CreateFile(PChar(F2), 0, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

  //Get the file times for the files.
  GetFileTime(F1, F1_CreateTime, F1_LastAccess, F1_LastWrite);
  GetFileTime(F2, F2_CreateTime, F2_LastAccess, F2_LastWrite);

  //Assign the function's result to comparison
  //-1, File1 is younger than File2
  //0, File1 is the same as File2
  //+1 File1 is older than File2
  Result := CompareFileTime(F1_CreateTime^, F2_CreateTime^);

  //Free the memory allocated to the pointers
  FreeMem(F1_CreateTime, SizeOf(TFileTime));
  FreeMem(F1_LastAccess, SizeOf(TFileTime));
  FreeMem(F1_LastWrite, SizeOf(TFileTime));
  FreeMem(F2_CreateTime, SizeOf(TFileTime));
  FreeMem(F2_LastAccess, SizeOf(TFileTime));
  FreeMem(F2_LastWrite, SizeOf(TFileTime));
end;

任何帮助都将不胜感激。

Delphi 2010已经包含了一个简单的包装器,用于在ioutils.pas中获取UTC时间。下面是一段比较文件的UTC创建时间的代码

uses
  IOUtils, DateUtils;

function CompareFileCreationTimeUtc(const aFile1, aFile2: String): integer;
var
  lCreationTime1: TDateTime;
  lCreationTime2: TDateTime;
begin

  lCreationTime1 := TFile.GetCreationTimeUtc(aFile1);
  lCreationTime2 := TFile.GetCreationTimeUtc(aFile2);

  Result := CompareDateTime(lCreationTime1, lCreationTime2);

end;

如果您不想使用IOUtils例程,并且喜欢自己执行,那么您的函数应该像(未测试)一样进行更正:


提示:声明TFileTime变量而不是PFileTime变量,并且不必使用GetMem和FreeMem(当然是FillChar)。将声明更改为TFileTime会在CreateFile调用上产生编译错误,因为它需要PFileTime。@TallGuy:使用地址运算符“@”传递指针,例如
GetFileTime(F1、@F1\u CreateTime、@F1\u LastAccess、@F1\u LastWrite)
谢谢,它现在可以编译了,但没有给出正确的结果。ie 2个日期明显不同的文件给出了相同的结果。欢迎使用Stack Overflow。所有这些代码与您关于UTC文件时间的问题有何关联?看起来您真的想问两个独立的问题。其中一个问题应该是关于文件是否存在两个不同的时区有相同的时间,另一个应该是关于代码的错误。请编辑此时区以删除不相关的部分,并将其发布在新问题中。
function CompareFileTimes(File1, File2 : String) : LongInt;
var
  F1, F2: THandle;
  F1_CreateTime, F2_CreateTime: TFileTime;
begin
  //Fill the structures with nulls for now
  ZeroMemory(@F1_CreateTime, SizeOf(TFileTime));
  ZeroMemory(@F2_CreateTime, SizeOf(TFileTime));

  //Get file handles for the files in question
  //Notice that even though we're using CreateFile
  //the open disposition for the file is OPEN_EXISTING
  F1 := CreateFile(PChar(File1), 0, FILE_SHARE_READ , nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  F2 := CreateFile(PChar(File2), 0, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

  if (F1=INVALID_HANDLE_VALUE) or (F1=INVALID_HANDLE_VALUE) then
    RaiseLastOSError;

  //Get the file times for the files.
  if not GetFileTime(F1, @F1_CreateTime, nil, nil) or
     not GetFileTime(F2, @F2_CreateTime, nil, nil) then
    RaiseLastOSError;
  //Assign the function's result to comparison
  //-1, File1 is younger than File2
  //0, File1 is the same as File2
  //+1 File1 is older than File2
  Result := CompareFileTime(F1_CreateTime, F2_CreateTime);
end;