文件日期在Delphi xe5中返回错误

时间:2014-03-14 15:04:52

标签: delphi delphi-xe5

我使用一个简单的命令从文件中获取文件日期,但是日期错误。

在我的电脑上,我看了看日期是14/3/2014。 但是当我运行命令时,无论我尝试什么文件,我都会得到30/12/1999,它会保持相同的返回日期。

我已经尝试了

BackupFileDate:=FileAge(S);;
    originalfiledate:=FileAge(fileName);

BackupFileDate:=GetFileModDate(S);
originalfiledate:=GetFileModDate(Filename);

function GetFileModDate(filename : string) : TDateTime;
var
   F : TSearchRec;
begin
   FindFirst(filename,faAnyFile,F);
   Result := F.TimeStamp;

   //Result := F.Time;
   FindClose(F);
end;

两者都有相同的结果。 PS:BackupFileDate和originalfiledate现在都定义为TDate,我已经尝试过TDateTime,结果相同。

我想获得上次编辑文件的日期和时间。

2 个答案:

答案 0 :(得分:6)

FileAge返回操作系统用来记录文件修改日期和时间等信息的时间戳。

您应该使用FileDateToDateTime函数将Integer值转换为更易于管理的TDateTime格式:

FileDateToDateTime(FileAge(fileName));

注意:

function FileAge(const FileName: string): Integer; overload;

已弃用。还有另一个版本的FileAge

function FileAge(const FileName: string; out FileDateTime: TDateTime; FollowLink: Boolean = True): Boolean;

返回FileDateTime输出参数中FileName的时间戳。

FileAge(filename, timeDate);

修改

根据数据的使用情况,convert from UTC to local time可能非常重要。

答案 1 :(得分:3)

tl; dr 使用TFile.GetLastWriteTimeTFile.GetLastWriteTimeUtc


您的第一次尝试失败,因为FileAge返回DOS日期时间值。这与TDateTime完全不同。

你的第二段代码基本上是可行的,模数是你忽略了检查错误的事实。错误的可能解释是您传递了无效的文件名。当对FindFirst的调用失败时,返回的搜索记录未定义。

TimeStamp TSearchRec属性将文件时间从UTC转换为本地,然后从文件时间转换为TDateTime

您想要解决缺少错误处理的问题:

function GetFileModDate(const FileName: string): TDateTime;
var
  F: TSearchRec;
begin
  if FindFirst(filename, faAnyFile, F)<>0 then
    raise SomeException.Create('...');
  Result := F.TimeStamp;
  FindClose(F);
end;

您应该清楚,这会在当地时间返回TDateTime

那就是说,我会使用IOUtils以独立于平台的方式进行。具体为TFile.GetLastWriteTimeTFile.GetLastWriteTimeUtc,具体取决于您希望如何处理时区。