如何在Delphi中获取文件的创建/最后修改日期?

12

我希望获得一个文件的这些属性作为整数值。


4
为什么要使用整数,TDateTime有什么问题吗? - Toon Krijthe
7个回答

15
function FileAge(const FileName: string; out FileDateTime: TDateTime): Boolean;

来自 SysUtils。


1
此评论发布时已被弃用。 - HX_unbanned
FileAge()获取的是文件创建日期,而不是最后修改日期。 - Jerry Gagnon
@JerryGagnon - 不是,它使用_WIN32_FILE_ATTRIBUTE_DATA.ftLastWriteTime - Gerry Coll
4
@HX_unbanned - 只有返回 FileTime 的第一个重载已经过时。 - Gerry Coll
该重载(overload)是在Delphi 2006中添加的(以防其他人在旧版本中遇到编译错误)。 - dummzeuch

13

Delphians(指Delphi编程语言的使用者)倾向于喜欢“FindFirst”方法(“SearchRec”结构包含一些这样的方法),但我建议使用Win32 API函数“GetFileAttributesEx”。


9

来自免费软件库DSiWin32:

function DSiFileTimeToDateTime(fileTime: TFileTime; var dateTime: TDateTime): boolean;
var
  sysTime: TSystemTime;
begin
  Result := FileTimeToSystemTime(fileTime, sysTime);
  if Result then
    dateTime := SystemTimeToDateTime(sysTime);
end; { DSiFileTimeToDateTime }

function  DSiGetFileTimes(const fileName: string; var creationTime, lastAccessTime,
  lastModificationTime: TDateTime): boolean; 
var
  fileHandle            : cardinal;
  fsCreationTime        : TFileTime;
  fsLastAccessTime      : TFileTime;
  fsLastModificationTime: TFileTime;
begin
  Result := false;
  fileHandle := CreateFile(PChar(fileName), GENERIC_READ, FILE_SHARE_READ, nil,
    OPEN_EXISTING, 0, 0);
  if fileHandle <> INVALID_HANDLE_VALUE then try
    Result :=
      GetFileTime(fileHandle, @fsCreationTime, @fsLastAccessTime,
         @fsLastModificationTime) and
      DSiFileTimeToDateTime(fsCreationTime, creationTime) and
      DSiFileTimeToDateTime(fsLastAccessTime, lastAccessTime) and
      DSiFileTimeToDateTime(fsLastModificationTime, lastModificationTime);
  finally
    CloseHandle(fileHandle);
  end;
end; { DSiGetFileTimes }

3
为什么使用var而不是out参数 - 你似乎没有使用传入的值? - Kohi
1
有道理。我是一名“老派”的程序员,在“out”被发明之前就学会了编程,并且在所有场合下自动使用“var”。 - gabr

5

System.IOUtils包含一个TFile记录,其中有多个函数可用于获取文件的年龄,例如GetCreationTime,GetLastAccessTime和GetLastWriteTime。


5
function GetFileModDate(filename : string) : TDateTime;
var
   F : TSearchRec;
begin
   FindFirst(filename,faAnyFile,F);
   Result := F.TimeStamp;
   //if you really wanted an Int, change the return type and use this line:
   //Result := F.Time;
   FindClose(F);
end;

F.Time已弃用,帮助文件建议使用F.TimeStamp。
仅供Delphi的后续版本更新。


4

这应该可以正常工作,而且它是原生的Delphi代码。

function GetFileModDate(filename : string) : integer;
var
  F : TSearchRec;
begin
  FindFirst(filename,faAnyFile,F);
  Result := F.Time;
  //if you wanted a TDateTime, change the return type and use this line:
  //Result := FileDateToDatetime(F.Time);
  FindClose(F);
end;

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接