delphi 文件操作(信息获取)

delphi获取Exe文件版本信息的函数



Type TFileVersionInfo = Record FixedInfo:TVSFixedFileInfo; {版本信息} CompanyName:String; {公司名称} FileDescription:String; {说明} FileVersion:String; {文件版本} InternalName:String; {内部名称} LegalCopyright:String; {版权} LegalTrademarks:String; {合法商标} OriginalFilename:String; {源文件名} ProductName:String; {产品名称} ProductVersion:String; {产品版本} Comments:String; {备注} LocalPort:String; {Local UDP_Message Port} end;
Function GetFileVerInfo(ExeFileName :Pchar;var VerSionInfo:TFileVersionInfo):Boolean;
var 
dwHandle, dwVersionSize : DWORD; 
Find : String; 
pcBuffer : PChar; 
pTemp : Pointer; 
FileVersionInfo : TVSFixedFileInfo; 
begin 
Find := ''; 
dwVersionSize := GetFileVersionInfoSize( PChar(ExeFilename),dwHandle ); 
if dwVersionSize = 0 then begin 
Result:=False; 
Exit; 
end; 
GetMem( pcBuffer, dwVersionSize ); 
if not GetFileVersionInfo( PChar(ExeFilename),dwHandle,dwVersionSize,pcBuffer ) then begin 
FreeMem(pcBuffer); 
Result:=False; 
Exit; 
end; 
if not VerQueryValue( pcBuffer,PChar(Find),pTemp,dwVersionSize ) then begin 
FreeMem(pcBuffer); 
Result:=False; 
Exit; 
end; 
FileVersionInfo:=PVSFixedFileInfo(pTemp)^; 
With FileVersionInfo do begin 
VersionInfo.FixedInfo.dwSignature:=dwSignature; 
VersionInfo.FixedInfo.dwStrucVersion:=dwStrucVersion; 
VersionInfo.FixedInfo.dwFileVersionMS:=dwFileVersionMS; 
VersionInfo.FixedInfo.dwFileVersionLS:=dwFileVersionLS; 
VersionInfo.FixedInfo.dwProductVersionMS:=dwProductVersionMS; 
VersionInfo.FixedInfo.dwProductVersionLS:=dwProductVersionLS; 
VersionInfo.FixedInfo.dwFileFlagsMask:=FileVersionInfo.dwFileFlagsMask; 
VersionInfo.FixedInfo.dwFileFlags:=fileVersionInfo.dwFileFlags; 
VersionInfo.FixedInfo.dwFileOS:=FileVersionInfo.dwFileOS; 
VersionInfo.FixedInfo.dwFileType:=FileVersionInfo.dwFileType; 
VersionInfo.FixedInfo.dwFileSubtype:=FileVersionInfo.dwFileSubtype; 
VersionInfo.FixedInfo.dwFileDateMS:=FileVersionInfo.dwFileDateMS; 
VersionInfo.FixedInfo.dwFileDateLS:=FileVersionInfo.dwFileDateLS; 
end; 
Find := 'StringFileInfo 80403A8'; 
if VerQueryValue( pcBuffer,PChar(Find+'CompanyName'),pTemp,dwVersionSize ) then 
VersionInfo.CompanyName:=PChar(pTemp) 
else begin 
Find := 'StringFileInfo 40904E4'; 
if VerQueryValue( pcBuffer,PChar(Find+'CompanyName'),pTemp,dwVersionSize ) then 
VersionInfo.CompanyName:=PChar(pTemp) 
else begin 
Result:=False; 
Exit; 
end; 
end; 
if VerQueryValue( pcBuffer,PChar(Find+'FileDescription'),pTemp,dwVersionSize ) then 
VersionInfo.FileDescription:=PChar(pTemp);

if VerQueryValue( pcBuffer,PChar(Find+'FileVersion'),pTemp,dwVersionSize ) then 
VersionInfo.FileVersion:=PChar(pTemp);

if VerQueryValue( pcBuffer,PChar(Find+'InternalName'),pTemp,dwVersionSize ) then 
VersionInfo.InternalName:=PChar(pTemp);

if VerQueryValue( pcBuffer,PChar(Find+'LegalCopyright'),pTemp,dwVersionSize ) then 
VersionInfo.LegalCopyright:=PChar(pTemp);

if VerQueryValue( pcBuffer,PChar(Find+'LegalTrademarks'),pTemp,dwVersionSize ) then 
VersionInfo.LegalTrademarks:=PChar(pTemp);

if VerQueryValue( pcBuffer,PChar(Find+'OriginalFilename'),pTemp,dwVersionSize ) then 
VersionInfo.OriginalFilename:=PChar(pTemp);

if VerQueryValue( pcBuffer,PChar(Find+'ProductName'),pTemp,dwVersionSize ) then 
VersionInfo.ProductName:=PChar(pTemp);

if VerQueryValue( pcBuffer,PChar(Find+'ProductVersion'),pTemp,dwVersionSize ) then 
VersionInfo.ProductVersion:=PChar(pTemp);

if VerQueryValue( pcBuffer,PChar(Find+'Comments'),pTemp,dwVersionSize ) then 
VersionInfo.Comments:=PChar(pTemp); 
if VerQueryValue( pcBuffer,PChar(Find+'LocalPort'),pTemp,dwVersionSize ) then 
VersionInfo.LocalPort:=PChar(pTemp) 
else 
VersionInfo.LocalPort:='66500'; 
FreeMem(pcBuffer ); 
Result:=True; 
end;
View Code

 Delphi从EXE或DLL获取ICO图标

WinAPI: ExtractIcon - 获取 EXE、DLL 或 ICO 文件中的图标

//声明:

ExtractIcon(
hInst: HINST; {调用函数的程序实例}
lpszExeFileName: PChar; {文件路径; 文件可以是 *.exe、*.dll、*.ico}
nIconIndex: UINT {图标索引}
): HICON; {返回图标句柄; 索引为 0 时返回第一个图标句柄; 索引为 #FFFFFFFF 时返回图标总数}

//举例:

View Code

例2:

View Code

 获取文件大小

大概有这些方法可以获得文件大小 
FileSizeByName(需要引用IdGlobal单元) 
GetFileSize 
FileSize(不能获得正在使用的文件大小) 
FileSeek 
TFileStream.Size 

下面是使用例子 
1。FileSizeByName(需要引用IdGlobal单元) 

begin 
if OpenDialog1.Execute then 
begin 
ShowMessage(IntToStr(FileSizeByName(OpenDialog1.Filename))); 
end; 
View Code

2。GetFileSize

var 
FileHandle:integer; 
begin 
if OpenDialog1.Execute then 
begin 
FileHandle := FileOpen(OpenDialog1.FileName, 0); 
ShowMessage(IntToStr(GetFileSize(FileHandle, nil))); 
FileClose(FileHandle); 
end; 
View Code

3。FileSize(不能获得正在使用的文件大小)

var f: file; 
begin 
if OpenDialog1.Execute then 
begin 
AssignFile(f, OpenDialog1.FileName); 
Reset(f, 1); 
ShowMessage(IntToStr(FileSize(f))); 
CloseFile(f); 
end; 
View Code

4。FileSeek

var 
FileHandle:integer; 
begin 
if OpenDialog1.Execute then 
begin 
FileHandle := FileOpen(OpenDialog1.FileName, 0); 
ShowMessage(IntToStr(FileSeek(FileHandle,0,2))); 
FileClose(FileHandle); 
end; 
View Code

5。TFileStream.Size

var 
FS: TFileStream; 
begin 
if OpenDialog1.Execute then 
begin 
FS := TFileStream.Create(OpenDialog1.FileName, fmShareDenyNone); 
ShowMessage(IntToStr(FS.Size)); 
FS.Free; 
end; 
View Code

另在IdGlobalProtocols中有个FileSizeByName()的函数。

6.首先,uses 添加 IdGlobalProtocols。

function GetFileSizeStr(nSize: Integer):string;
begin
  if nSize > 1073741824 then
    Result := FormatFloat('###,##0.00G', nSize / 1073741824)
  else if nSize > 1048576 then
    Result := FormatFloat('###,##0.00M', nSize / 1048576)
  else if nSize > 1024 then
    Result := FormatFloat('###,##00K', nSize / 1024)
  else
    Result := FormatFloat('###,#0B', nSize);
  if Length(Result) > 2 then
    if Result[1] = '0' then
      Delete(Result, 1, 1);
end;

function TForm1.GetFileSizeStr(fName:string):string;
var nSize: Integer;
begin
  nSize := FileSizeByName(fName);
  if nSize > 1073741824 then
    Result := FormatFloat('###,##0.00G', nSize / 1073741824)
  else if nSize > 1048576 then
    Result := FormatFloat('###,##0.00M', nSize / 1048576)
  else if nSize > 1024 then
    Result := FormatFloat('###,##00K', nSize / 1024)
  else
    Result := FormatFloat('###,#0B', nSize);
  if Length(Result) > 2 then
    if Result[1] = '0' then
      Delete(Result, 1, 1);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('文件大小是: ' + GetFileSizeStr('d:	able.mdb'));
end;
View Code

递归枚举目录下所有文件并显示大小KBMBGB自动换算

unction FormatByteSize(const bytes: Int64): string;
const
  B = 1; //byte
  KB = 1024 * B; //kilobyte
  MB = 1024 * KB; //megabyte
  GB = 1024 * MB; //gigabyte
begin
  if bytes > GB then
    result := FormatFloat('#.## GB', bytes / GB)
  else
    if bytes > MB then
      result := FormatFloat('#.## MB', bytes / MB)
    else
      if bytes > KB then
        result := FormatFloat('#.## KB', bytes / KB)
      else
        result := Format('%d B', [bytes]);
end;
View Code

 获取程序版本及时间

function GetVersionString(FileName: string): string;   //得到文件版本
    var
     VerInfoSize: DWORD;
     VerInfo: Pointer;
     VerValueSize: DWORD;
     Dummy: DWORD;
     VerValue: PVSFixedFileInfo;
    begin
     Result := '';
     VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy);
     if VerInfoSize = 0 then Exit;
     GetMem(VerInfo, VerInfoSize);
     GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, VerInfo);
     VerQueryValue(VerInfo, '', Pointer(VerValue), VerValueSize);
     Result := IntToStr(VerValue^.dwFileVersionMS shr 16) + '.' +
     IntToStr(VerValue^.dwFileVersionMS and $FFFF) + '.' +
     IntToStr(VerValue^.dwFileVersionLS shr 16) + '.' +
     IntToStr(VerValue^.dwFileVersionLS and $FFFF);
     FreeMem(VerInfo);
    end;

  function   GetFileCreationTime(const   Filename:   string):   TDateTime;  //获应用程序时间
  var   
      Data:   TWin32FindData;   
      H:   THandle;   
      FT:   TFileTime;   
      I:   Integer;   
  begin
  {
            Data.ftCreationTime:   TFileTime;   //创建时间
            Data.ftLastAccessTime:   TFileTime; //最后访问时间
            Data.ftLastWriteTime:   TFileTime;  //最后修改时间
   }
      H   :=   FindFirstFile(PCHAR(Filename),   Data);   
      if   H   <>   INVALID_HANDLE_VALUE   then   begin   
          try
              FileTimeToLocalFileTime(Data.ftLastWriteTime,   FT);
              FileTimeToDosDateTime(FT,   LongRec(I).Hi,   LongRec(I).Lo);   
              Result   :=   FileDateToDateTime(I);   
          finally   
              Windows.FindClose(H);   
          end   
      end   else   begin   
          Result   :=   0;   
      end;   
  end;
View Code

文件版本及时间

function GetVersionString(FileName: string): string;   //得到文件版本
    var
     VerInfoSize: DWORD;
     VerInfo: Pointer;
     VerValueSize: DWORD;
     Dummy: DWORD;
     VerValue: PVSFixedFileInfo;
    begin
     Result := '';
     VerInfoSize := GetFileVersionInfoSize(PChar(FileName), Dummy);
     if VerInfoSize = 0 then Exit;
     GetMem(VerInfo, VerInfoSize);
     GetFileVersionInfo(PChar(FileName), 0, VerInfoSize, VerInfo);
     VerQueryValue(VerInfo, '', Pointer(VerValue), VerValueSize);
     Result := IntToStr(VerValue^.dwFileVersionMS shr 16) + '.' +
     IntToStr(VerValue^.dwFileVersionMS and $FFFF) + '.' +
     IntToStr(VerValue^.dwFileVersionLS shr 16) + '.' +
     IntToStr(VerValue^.dwFileVersionLS and $FFFF);
     FreeMem(VerInfo);
    end;

  function   GetFileCreationTime(const   Filename:   string):   TDateTime;  //获应用程序时间
  var   
      Data:   TWin32FindData;   
      H:   THandle;   
      FT:   TFileTime;   
      I:   Integer;   
  begin
  {
            Data.ftCreationTime:   TFileTime;   //创建时间
            Data.ftLastAccessTime:   TFileTime; //最后访问时间
            Data.ftLastWriteTime:   TFileTime;  //最后修改时间
   }
      H   :=   FindFirstFile(PCHAR(Filename),   Data);   
      if   H   <>   INVALID_HANDLE_VALUE   then   begin   
          try
              FileTimeToLocalFileTime(Data.ftLastWriteTime,   FT);
              FileTimeToDosDateTime(FT,   LongRec(I).Hi,   LongRec(I).Lo);   
              Result   :=   FileDateToDateTime(I);   
          finally   
              Windows.FindClose(H);   
          end   
      end   else   begin   
          Result   :=   0;   
      end;   
  end;
View Code

获取和修改文件的时间

Delphi中提供了很完备的Windows API函数的调用接口,可以方便的进行高级Windows编程。利用Delphi中的FindFirst函数可以得到一个文件的属性记录,该记录中的 FindData域中就记载了详细的文件时间信息。然而遗憾的是,FindData中的时间信息是不能直接得到的。

function CovFileDate(Fd:_FileTime):TDateTime; 
{ 转换文件的时间格式 } 
var 
Tct:_SystemTime; 
Temp:_FileTime; 
begin 
FileTimeToLocalFileTime(Fd,Temp); 
FileTimeToSystemTime(Temp,Tct); 
CovFileDate:=SystemTimeToDateTime(Tct); 
end; 
View Code

有了上面的函数支持,我们就可以获取一个文件的时间信息了。以下是一个简单的例子:

procdeure GetFileTime(const Tf:string); 
{ 获取文件时间,Tf表示目标文件路径和名称 } 
const 
Model='yyyy/mm/dd,hh:mm:ss'; { 设定时间格式 } 
var 
Tp:TSearchRec; { 申明Tp为一个查找记录 } 
T1,T2,T3:string; 
begin 
FindFirst(Tf,faAnyFile,Tp); { 查找目标文件 } T1:=FormatDateTime(Model, 
CovFileDate(Tp.FindData.ftCreationTime))); 
{ 返回文件的创建时间 } 
T2:=FormatDateTime(Model, 
CovFileDate(Tp.FindData.ftLastWriteTime))); 
{ 返回文件的修改时间 } 
T3:=FormatDateTime(Model,Now)); 
{ 返回文件的当前访问时间 } 
FindClose(Tp); 
end; 
View Code

设置文件的时间要复杂一些,这里介绍利用Delphi中的DataTimePicker组件来辅助完成这一复杂的操作。下面的例子利用了四个 DataTimePicker组件来完成文件创建时间和修改时间的设置。注意:文件的访问时间用修改时间来代替。使用下面的例子时,请在您的Form上添 加四个DataTimePicker组件。其中第一和第三个DataTimePicker组件中的Kind设置为dtkDate,第二个和第四个 DataTimePicker组件中的Kind设置为dtkTime.

procedure SetFileDateTime(const Tf:string); 
{ 设置文件时间,Tf表示目标文件路径和名称 } 
var 
Dt1,Dt2:Integer; 
Fs:TFileStream; 
Fct,Flt:TFileTime; 
begin 
Dt1:=DateTimeToFileDate( 
Trunc(Form1.DateTimePicker1.Date) + Frac(Form1.DateTimePicker2.Time)); 
Dt2:=DateTimeToFileDate( 
Trunc(Form1.DateTimePicker3.Date) + Frac(Form1.DateTimePicker4.Time)); 
{ 转换用户输入在DataTimePicker中的信息 } 
try 
FS := TFileStream.Create(Tf, fmOpenReadWrite); 
try 
if DosDateTimeToFileTime(LongRec(DT1).Hi, LongRec(DT1).Lo, Fct) and 
LocalFileTimeToFileTime(Fct, Fct) and 
DosDateTimeToFileTime(LongRec(DT2).Hi, LongRec(DT2).Lo, Flt) and 
LocalFileTimeToFileTime(Flt, Flt) 
then SetFileTime(FS.Handle, 
@Fct, @Flt, @Flt); 
{ 设置文件时间属性 } 
finally 
FS.Free; 
end; 
except 
MessageDlg('日期修改操作失败!', 
mtError, [mbOk], 0); 
{ 因为目标文件正在被使用等原因而导致失败 } 
end; 
end; 
View Code

以上简单介绍了文件时间属性的修改方法,请注意:修改文件时间的范围是从公元1792年9月19日开始的,上限可以达到公元2999年或更高。

从exe、dll文件中提取、存取图标

unit UFormIconGrabber;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ShellAPI, ExtDlgs;
type
  TForm1 = class(TForm)
    Image1: TImage;
    btNextIcon: TButton;
    Label1: TLabel;
    EditFileName: TEdit;
    btBowserFile: TButton;
    OpenDialog1: TOpenDialog;
    btSaveIco: TButton;
    SavePictureDialog1: TSavePictureDialog;
    btPrevirousIcon: TButton;
    procedure btNextIconClick(Sender: TObject);
    procedure btBowserFileClick(Sender: TObject);
    procedure btSaveIcoClick(Sender: TObject);
    procedure btPrevirousIconClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    Procedure MoveIconIndex(Const OperateString:String);
  end;
var
  Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.MoveIconIndex(Const OperateString:String);
const
 I : Integer = 0;
 FileName : String = ;
var
 Count : Integer;
begin
 if( FileName <> EditFileName.Text ) then
     begin
         FileName := EditFileName.Text;
         I := 0;
     end
 else
     if OperateString=MoveNextIcon then
        Inc(I)
     else
        begin
            if I>0 then
               dec(I);
        end;
//得到总的图标数目
 Count := ExtractIcon( Application.Handle, PChar(FileName),$FFFFFFFF);
 if( I < Count ) then
  Image1.Picture.Icon.Handle :=
   ExtractIcon( Application.Handle, PChar(FileName), I ) // I为图标的索引
 else
   ShowMessage(此文件没有更多的图标资源! );
end;
procedure TForm1.btNextIconClick(Sender: TObject);
begin
 MoveIconIndex(MoveNextIcon);
end;
procedure TForm1.btBowserFileClick(Sender: TObject);
begin
     try
        OpenDialog1.Title:=选择EXE文件或DLL文件:;
        OpenDialog1.Filter:=提取文件(*.EXE;*.DLL;*.ICO)|*.DLL;*.EXE;*.ICO|All files (*.*)|*.*;
        OpenDialog1.FilterIndex:=1;
        if OpenDialog1.Execute then
           EditFileName.Text :=OpenDialog1.FileName;
        MoveIconIndex(MoveNextIcon);   
     except
        exit;
     end;

end;

procedure TForm1.btSaveIcoClick(Sender: TObject);
begin
     SavePictureDialog1.DefaultExt := GraphicExtension(TIcon);
     SavePictureDialog1.Filter := GraphicFilter(TIcon);
     if SavePictureDialog1.Execute then
        image1.Picture.SaveToFile(SavePictureDialog1.FileName);
end;
procedure TForm1.btPrevirousIconClick(Sender: TObject);
begin
    MoveIconIndex(MovePrevIcon);
end;
end.
View Code

这样我们使用TImage.Picture.SaveToFile方法就可以很容易地将图标保存到单独的文件中,然后再利用Image Editor作适量的修改即可!

 实现获取图标及将图标添加到TImageList中的过程

 uses
 ShellAPI;
 var
  IconList:TStringList;
{$R *.dfm}
{ 实现获取图标及将图标添加到TImageList中的过程 }
procedure TForm1.ListView_SetItemImageIndex(Item: TListItem);
var
  nIndex:Integer;
  Icon:TIcon;
  fileName:string;
  extName:string;
  sinfo:SHFILEINFO;
begin
  if TListView(Item.ListView).SmallImages<>nil then
  begin
    fileName:=Item.Caption;
    extName:=ExtractFileExt(fileName);
    nIndex:=IconList.IndexOf(extName);
    if nIndex>-1 then
    begin
      nIndex:=Integer(IconList.Objects[nIndex]);
      Item.ImageIndex:=nIndex;
    end else
    begin
      FillChar(sinfo, SizeOf(sinfo),0);
      SHGetFileInfo(PChar(extName),FILE_ATTRIBUTE_NORMAL,sinfo,SizeOf(sInfo),
                    SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SMALLICON);
      if sinfo.hIcon>0 then
      begin
        Icon:=TIcon.Create;  
        Icon.Handle:=sinfo.hIcon;
        nIndex:=TListView(Item.ListView).SmallImages.AddIcon(Icon);
        Icon.Free;
        Item.ImageIndex:=nIndex;  
        IconList.AddObject(extName,TObject(nIndex));
      end;
    end;
  end;
end;
//end;
procedure TForm1.Button1Click(Sender: TObject);
var
  Item:TListItem;
begin
  Item:=ListView1.Items.Add;
  Item.Caption:='C:';
  ListView_SetItemImageIndex(Item);
end;

{ 对IconList进行初始化及释放 }
initialization
  IconList:=TStringList.Create;
finalization
  IconList.Free;
View Code

获取文件图标、文件名、文件类型、文件属性,图标加载

来源 https://www.cnblogs.com/zousheng7018/archive/2012/10/15/2725162.html

一、图标的获取   要使用动态图标,首先要解决的是如何获得显示文本和与其相关联的图标句柄。该图标通过文件关联由系统注册表决定,并且在Windows编程中同一文件 (或子目录,或文件夹)在桌面上也可能有两种显示结果,这就是DOS文件名与显示名(Display Name)。如果我们的应用程序不需要有像Windows资源浏览器那样的效果,则可以使用FindFirst()和FindNext()二个函数以及 FindClose()过程来获得DOS文件名,否则我们就应当使用WindowsAPI来获得显示名。在获得文件名的同时可通过使用 ShellAPI.pas中的SHGetFileInfo()函数来获得其图标句柄HICON,说明如下:  

    

View Code

    cbFileInfo 参数:psfi的比特值;  

    uFlags 参数:指明需要返回的文件信息标识符,常用的有以下常数:   SHGFI_ICON; //获得图标   SHGFI_DISPLAYNAME; //获得显示名   SHGFI_TYPENAME; //获得类型名   SHGFI_ATTRIBUTES;//获得属性   SHGFI_LARGEICON; //获得大图标   SHGFI_SMALLICON; //获得小图标   SHGFI_PIDL;// pszPath是一个标识符   函数SHGetFileInfo()的返回值也随uFlags的取值变化而有所不同。

    通过调用SHGetFileInfo()可以由psfi参数得到文件的图标句柄,但要注意在uFlags参数中不使SHGFI_PIDL时,SHGetFileInfo()不能获得"我的电脑"等虚似文件夹的信息。


    二、图标的加载   使用Delphi提供的TImageList组件,通过调用CommCtrl .pas中的函数ImageList_AddIcon()来加载得到的图标,并要保证其索引号与显示文本相对应。说明如下:  

    function ImageList_AddIcon(ImageList: HIMAGELIST; //加载图标的ImageList句柄   Icon: Hicon //加载的图标句柄 ): Integer; //返回图标在ImageList中的索引号   在需要指明图标索引号时可使用ImageList_AddIcon()的返回值。      

    三、图标和文本的绘图式输出   对于组合框、列表框等不能直接显示图标的组件,由于要求显示图标的同时又要同时显示文本,可通过设置其相应的Style属性达到目的,示例如下:  

    组合框:ComboBox1.Style:=csOwnerDrawVariable根据实际使用经验最好不要在ObjectInspector窗体中直接设置,而应将代码添加在程序的适当位置,否则可能出现绘图区域高度不规则变化  

    列表框:ListBox1.Style:=lbOwnerDrawVariable   状态栏:StatusBar1.Panels[i].Style:= psOwnerDraw 不能使用简单状态栏,i是状态栏中要绘制图标的某一窗格索引号,图形输出可使用TImageList的ImageList1.Draw()方法,而文本输出则可使用TCanvas的TextOut()方法,它由组件的Canvas属性继承得到,显然没有Canvas属性的组件不能使用此方法显示图标。  

    对于可直接显示图标的组件,直接指定其Images、StateImages等需要的图标属性为相应的TimageList组件名,并通过指定图标的索引号则可显示图标。

    需要注意的是:在使用大图标时,必须先调用TImageList的CreateSize()方法指定可加载图标的尺寸,并且在每次调用 TImageList的Clear方法后都要重新调用CreateSize()。   使用TImageList的ImageList1.Clear方法清除已加载的图标,常在需要刷新时使用。      这种方法只是取扩展名所示文件的图标,完全完全不需要文件存在!!!! 

View Code

 读取 文件大小、类型、以及修改时间

取文件修改时间

View Code
View Code

获取文件或文件夹属性和修改属性

View Code

1、修改隐藏属性的代码片段

View Code

2、修改取消隐藏属性的代码片段

View Code

 fileSetAttr 和 setFileAttributes都是修改文件属性,只是前者来自System.SysUtils,后者来自WinAPI.Windows

附文件属性常量

    faReadOnly $00000001 Read-only files 只读文件

    faHidden $00000002 Hidden files 隐藏文件

    faSysFile $00000004 System files 系统文件

    faVolumeID $00000008 Volume ID files 卷标文件

    faDirectory $00000010 Directory files 目录

    faArchive $00000020 Archive files 归档文件

    faAnyFile $0000003F Any file 任意文件

取消只需要在常量前面加not,例如:not faReadOnly取消只读文件

View Code

1. 在interface下的uses中引用filectrl单元

2. 首先取文件属性

View Code

3. 设置文件属性(如设置归档属性 -> faArchive )

View Code

4. 附文件属性常量

    Constant Value Description
    faReadOnly $00000001 Read-only files 只读文件
    faHidden $00000002 Hidden files 隐藏文件
    faSysFile $00000004 System files 系统文件
    faVolumeID $00000008 Volume ID files 卷标文件
    faDirectory $00000010 Directory files 目录
    faArchive $00000020 Archive files 归档文件
    faAnyFile $0000003F Any file 任意文件

备注:

如果设置文件属性为隐藏则 FileSetAttr('文件全路径',2),

要是设置为只读+隐藏FileSetAttr('文件全路径',3)

打开文件夹并定位到一个文件

用shellExecute 单元 打开一个文件夹,那如何打开一个文件夹并选中指定的文件呢。
下面一个函数就可以就可以做到:

filepath:='F:123.txt';

ShellExecute(0, nil, PChar('explorer.exe'),PChar('/e,/select,'+ filepath), nil, SW_NORMAL);

 获取文件的版本等信息

View Code

如何用Delphi编程读出一个DLL文件的版本号,请给示例

好,给几个函数还不行,那就给段代码吧:

View Code

如何获取一个可执行文件的版本号?

View Code

//得到文件版本

View Code

在Delphi中获取和修改文件的时间

本文介绍了在Delphi中利用系统函数和Windows API函数调用来获取和修改文件的时间信息的方法。

熟悉Windows 95/98的朋友一定经常会用单击鼠标右键的方法来查看所选定的文件的属性信息。在属性菜单中会列出该文件的创建时间、修改时间和访问时间。这些信息常常是很有用的,它们的设置一般都是由操作系统(也就是由Dos/Windows等等)自动完成的,不会让用户轻易修改。

这里,我向大家介绍在Delphi中如何实现文件时间的获取和修改方法。Delphi中提供了很完备的Windows API函数的调用接口,可以方便的进行高级Windows编程。利用Delphi中的FindFirst函数可以得到一个文件的属性记录,该记录中的FindData域中就记载了详细的文件时间信息。然而遗憾的是,FindData中的时间信息是不能直接得到的。因此,有人(编者按:很遗憾不知此人姓名)编写了一个转换函数来完成文件时间格式的转换。下面给出了具体的实现方法,仅供参考:

View Code

设置文件的时间要复杂一些,这里介绍利用Delphi中的DataTimePicker组件来辅助完成这一复杂的操作。下面的例子利用了四个DataTimePicker组件来完成文件创建时间和修改时间的设置。注意:文件的访问时间用修改时间来代替。使用下面的例子时,请在您的Form上添加四个DataTimePicker组件。其中第一和第三个DataTimePicker组件中的Kind设置为dtkDate,第二个和第四个DataTimePicker组件中的Kind设置为dtkTime.

View Code

以上简单介绍了文件时间属性的修改方法,请注意:修改文件时间的范围是从公元1792年9月19日开始的,上限可以达到公元2999年或更高。另外,请不要将此技术用于破坏他人文件等非正当途径。

获取文件创建,修改时间

View Code

 得到文件创建时间,修改时间,访问时间

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
OpenDialog1: TOpenDialog;
Edit2: TEdit;
Label2: TLabel;
Label3: TLabel;
Edit3: TEdit;
Label4: TLabel;
Edit4: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function FGetFileTime(sFileName:string;TimeType:Integer):TDateTime;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.FGetFileTime(sFileName:string;
TimeType:Integer):TDateTime;
var
ffd:TWin32FindData;
dft:DWord;
lft,Time:TFileTime;
H:THandle;
begin
H:=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"
Windows.FindClose(H);
//转换FILETIME格式成为localFILETIME格式
FileTimeToLocalFileTime(Time,lft);
//转换FILETIME格式成为DOStime格式
FileTimeToDosDateTime(lft,LongRec(dft).Hi,LongRec(dft).Lo);
//最后,转换DOStime格式成为Delphi's应用的TdateTime格式
Result:=FileDateToDateTime(dft);
end
else
result:=0;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;
Edit2.Text:=DateToStr(FGetFileTime(Edit1.Text,0));
Edit3.Text:=DateToStr(FGetFileTime(Edit1.Text,1));
Edit4.Text:=DateToStr(FGetFileTime(Edit1.Text,2));
end;
end.
View Code

相关推荐