我使用一个简单的命令从文件中获取文件日期,但是日期错误。
在我的电脑上,我看了看日期是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,结果相同。
我想获得上次编辑文件的日期和时间。
答案 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.GetLastWriteTime
或TFile.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.GetLastWriteTime
或TFile.GetLastWriteTimeUtc
,具体取决于您希望如何处理时区。