【问题标题】:How to get create/last modified dates of a file in Delphi?如何在 Delphi 中获取文件的创建/最后修改日期?
【发布时间】:2010-09-13 18:05:18
【问题描述】:

我想将这些属性作为整数值获取文件。

【问题讨论】:

  • 为什么是整数,TDateTime 有什么问题?

标签: windows delphi file


【解决方案1】:

Delphians 倾向于喜欢 FindFirst 方法(SearchRec 结构有一些),但我建议使用 Win32 API 函数 GetFileAttributesEx

【讨论】:

    【解决方案2】:

    您可以调用GetFileInformationByHandle winapi 函数。 Aparently JCL 有一个 GetFileLastWrite 函数,你也可以使用

    【讨论】:

      【解决方案3】:

      试试

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

      来自 SysUtils。

      【讨论】:

      • 截至发表此评论时已弃用。
      • FileAge() 获取文件的创建日期,而不是最后修改日期。
      • @JerryGagnon - 不,它使用_WIN32_FILE_ATTRIBUTE_DATA.ftLastWriteTime
      • @HX_unbanned - 仅弃用第一个重载(返回 FileTime)
      • Delphi 2006 中添加了重载(以防其他人在使用旧版本时遇到编译错误)
      【解决方案4】:

      来自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 }
      

      【讨论】:

      • 为什么是 var 而不是 out 参数——你似乎没有使用进来的值?
      • 有效点。我是一个“老派”程序员,我在“out”发明之前就学会了,我在所有场合都会自动使用“var”。
      【解决方案5】:

      这应该可以工作,而且它是本机 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;
      

      【讨论】:

        【解决方案6】:
        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

        【讨论】:

          【解决方案7】:

          System.IOUtils 确实有一个 TFile 记录,其中包含几个用于获取文件年龄的函数,例如GetCreationTime、GetLastAccessTime、GetLastWriteTime

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-02-26
            • 1970-01-01
            • 2012-08-07
            • 2012-07-07
            • 2011-05-20
            • 1970-01-01
            相关资源
            最近更新 更多