第5章 文件技术编程实例

实例86 获取文件属性

    

Windows提供的资源管理器中,选中某个文件,在其上右击,选择“属性”,就会弹出一个“属性”对话框,在其中会显示文件的各种属性。本实例将演示如何获取文件的属性,包括文件的位置、大小、是否只读、是否隐藏、是否为存档文件、是否为系统文件等。

向窗体上添加一个TTabbedNotebook组件、两个TShape组件、4TCheckBox组件、4TLabel组件、一个TOpenDialog和一个TBitBtn组件。设计完成的主界面如图5-8所示。

5-8  主界面

在程序运行过程中需要两个全局变量AttributesFileName,其中Word类型的Attributes变量用于存储文件的属性,而String类型的FileName属性用于存储文件的路径和文件名。

另外还要在FormCreate()过程中添加下列代码:

procedure TfrmMain.FormCreate(Sender: TObject);

begin

    if OpenDialog.Execute then

    begin

        FileName:= OpenDialog.FileName;

        Attributes := FileGetAttr(FileName);

        ReadOnly.Checked := (Attributes and faReadOnly) = faReadOnly;

        Archive.Checked := (Attributes and faArchive) = faArchive;

        System.Checked := (Attributes and faSysFile) = faSysFile;

        Hidden.Checked := (Attributes and faHidden) = faHidden;

        lblPosition.Caption:= lblPosition.Caption+ExtractFileDir(FileName);

        lblName.Caption:=lblName.Caption+ExtractFileName(FileName);

        lblSize.Caption:=lblSize.Caption+Format('%d bytes', [GetFileSize(FileName)]);

    end;

end;

程序运行初期就会执行FormCreate中的代码,首先通过OpenDialog.Execute语句来显示一个提示读者选择文件的对话框。

如果用户在该对话框中确认选择了一个有效文件后,就把文件路径和文件名等信息存储在变量FileName中,把文件读写属性等信息存储在变量Attributes中。

然后通过判断Attributes分别与faReadOnlyfaArchivefaSysFilefaHidden常量比较的结果来决定ReadOnlyArchiveSystemHidden4CheckBox组件的选中状态。

通过lblPosition.Caption:=lblPosition.Caption+ExtractFileDir(FileName)语句在lblPosition组件中显示文件位置,通过lblName.Caption:=lblName.Caption+ExtractFileName (FileName)语句显示文件名。最后通过GetFileSize函数和lblSize.Caption:=lblSize.Caption+ Format('%d bytes', [GetFileSize(FileName)])语句来显示文件大小,GetFileSize函数代码如下:

function TfrmMain.GetFileSize(const FileName: string): LongInt;

var

  SearchRec: TSearchRec;

begin

  try

    if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then

      Result := SearchRec.Size

    else Result := -1;

  finally

    SysUtils.FindClose(SearchRec);

  end;

end;

首先声明SearchRec为一个查找记录,然后通过FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec)语句来查找目标文件,找到后设置GetFileSize函数的返回值为目标文件的大小SearchRec.Size

程序代码如下:

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ExtCtrls, StdCtrls, ComCtrls, TabNotBk, Buttons;

type

  TfrmMain = class(TForm)

    OpenDialog: TOpenDialog;

    TabbedNotebook1: TTabbedNotebook;

    Shape1: TShape;

    Shape2: TShape;

    BtnClose: TBitBtn;

    Label1: TLabel;

    ReadOnly: TCheckBox;

    Hidden: TCheckBox;

    Archive: TCheckBox;

    System: TCheckBox;

    lblPosition: TLabel;

    lblSize: TLabel;

    lblName: TLabel;

    procedure FormCreate(Sender: TObject);

    function GetFileSize(const FileName: string): LongInt;

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  frmMain: TfrmMain;

  Attributes: Word;

  FileName:String;

 

implementation

{$R *.dfm}

 

procedure TfrmMain.FormCreate(Sender: TObject);

begin

    if OpenDialog.Execute then

    begin

        FileName:= OpenDialog.FileName;

        Attributes := FileGetAttr(FileName);

        ReadOnly.Checked := (Attributes and faReadOnly) = faReadOnly;

        Archive.Checked := (Attributes and faArchive) = faArchive;

        System.Checked := (Attributes and faSysFile) = faSysFile;

        Hidden.Checked := (Attributes and faHidden) = faHidden;

 

        lblName.Caption:=lblName.Caption+ExtractFileName(FileName);

        lblPosition.Caption:= lblPosition.Caption+ExtractFileDir(FileName);

       lblSize.Caption:=lblSize.Caption+Format('%d bytes', [GetFileSize(FileName)]);;

    end;

end;

 

function TfrmMain.GetFileSize(const FileName: string): LongInt;

var

  SearchRec: TSearchRec;

begin

  try

    if FindFirst(ExpandFileName(FileName), faAnyFile, SearchRec) = 0 then

      Result := SearchRec.Size

    else Result := -1;

  finally

    SysUtils.FindClose(SearchRec);

  end;

end;

end.

保存文件,然后按F9键运行程序,程序运行的初始画面如图5-9所示。

5-9  程序运行的初始画面

在“打开”对话框中选择了一个有效文件后,单击“打开”按钮,程序就会在主窗体中显示文件的属性信息,如图5-10所示。

5-10  程序运行结果