欢迎光临!
若无相欠,怎会相见

Delphi-获取文件日期、文件大小和绝对路径

序言

昨天把文件的 MD5 获取了,本次获取文件的日期,包括创建时间、修改时间和访问时间,文件的大小和文件存储的绝对路径。在网上找资料测试终于完成这个任务。

路径

GUI仍是一顿拖放,没有设计细胞,只能按照最简单的。布局如下:

文件的绝对路径很容易获取到,可以直接使用 OpenDialog_1.FileName ,FileName 属性获取的就是绝对路径。

时间

创建时间是在本地电脑创建文件的时间,不是第一个创建这个文件的时间。因此创建时间有时候会比访问时间要晚。在 Delphi 中,文件的创建时间、修改时间和访问时间都已经封装好了,可以直接使用。创建时间用的是 ftCreationTime, 修改时间用的是 ftLastWriteTime, 访问时间用的是 ftLastAccessTime 。

大小

文件大小在Delphi中的获取方法很多。从我找到的资料看,我知道的有5种,分别是:FileSizeByName, GetFileSize, FileSize, FileSeek 和 TFileStream.Size,具体是使用方法,可以参见下方的代码。

源代码

上文中说到的方法都能在下方看到时如何使用的。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdGlobalProtocols;

type
  TForm1 = class(TForm)
    Button_1: TButton;
    OpenDialog_1: TOpenDialog;
    Edit_1: TEdit;
    Edit_2: TEdit;
    Edit_3: TEdit;
    Edit_4: TEdit;
    Edit_5: TEdit;
    procedure Button_1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

function FGetFileTime(sFileName:string;TimeType:Integer):TDateTime;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function FGetFileTime(sFileName:string; TimeType:Integer):TDateTime;
var
  ffd:TWin32FindData;
  dft:DWord;
  lft,Time:TFileTime;
  H:THandle;
begin
  H:= Winapi.Windows.FindFirstFile(PChar(sFileName),ffd);
  case TimeType of
    0:Time:=ffd.ftCreationTime;
    1:Time:=ffd.ftLastWriteTime;
    2:Time:=ffd.ftLastAccessTime;
  end;
  { 获取文件信息 }
  if(H<>INVALID_HANDLE_VALUE)then
  begin
    { 只查找一个文件,所以关掉 find }
    Winapi.Windows.FindClose(H);
    { 转换 FILETIME 格式成为 localFILETIME 格式 }
    FileTimeToLocalFileTime(Time,lft);
    { 转换 FILETIME 格式成为 DOStime 格式 }
    FileTimeToDosDateTime(lft,LongRec(dft).Hi,LongRec(dft).Lo);
    { 最后,转换 DOStime 格式成为 Delphi 应用的 TdateTime 格式 }
    Result:=FileDateToDateTime(dft);
  end
  else
    result:=0;
end;

procedure TForm1.Button_1Click(Sender: TObject);
var
  FileHandle:integer;
  f: file;
  FS: TFileStream;
begin
  if OpenDialog_1.Execute then
    Edit_1.Text:= OpenDialog_1.FileName;
    Edit_2.Text:= '创建时间: ' + DateToStr(FGetFileTime(Edit_1.Text,0));
    Edit_3.Text:= '修改时间: ' + DateToStr(FGetFileTime(Edit_1.Text,1));
    Edit_4.Text:= '访问时间: ' + DateToStr(FGetFileTime(Edit_1.Text,2));
    { FileSizeByName 函数需要 IdGlobalProtocols }
    Edit_5.Text:= '文件大小: ' + IntToStr(FileSizeByName(OpenDialog_1.Filename)) + ' 字节';
      { GetFileSize 函数获取文件大小 }
//    FileHandle := FileOpen(OpenDialog_1.FileName, 0);
//    ShowMessage(IntToStr(GetFileSize(FileHandle, nil)));
//    FileClose(FileHandle);
      { FileSize 函数获取文件大小 }
//    AssignFile(f, OpenDialog_1.FileName);
//    Reset(f, 1);
//    ShowMessage(IntToStr(FileSize(f)));
//    CloseFile(f);
      { FileSeek 函数获取文件大小 }
//    FileHandle := FileOpen(OpenDialog_1.FileName, 0);
//    ShowMessage(IntToStr(FileSeek(FileHandle,0,2)));
//    FileClose(FileHandle);
      { TFileStream.Size 获取文件大小 }
//    FS := TFileStream.Create(OpenDialog_1.FileName, fmShareDenyNone);
//    ShowMessage(IntToStr(FS.Size));
//    FS.Free;
end;

end.

验证结果如下:

目前没法什么问题

结语

小的功能目前都已经实现了,可以尝试吧小功能组合到一块去,完成自己的idea。

如有错误,敬请指出,感谢指正!  — 2020-06-07  12:42:02

 

赞(1) 打赏
转载请注明:飘零博客 » Delphi-获取文件日期、文件大小和绝对路径
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

欢迎光临