• 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 := 'StringFileInfo80403A8'; 
    if VerQueryValue( pcBuffer,PChar(Find+'CompanyName'),pTemp,dwVersionSize ) then 
    VersionInfo.CompanyName:=PChar(pTemp) 
    else begin 
    Find := 'StringFileInfo40904E4'; 
    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
  • 相关阅读:
    shell脚本
    恋练有词
    sublime text3 的汉化
    c#中如何将int i=1;转化成string s="0001"
    SQL语句中DateAdd 函数说明
    ASP.NET弹出对话框
    C/C++避免头文件包含造成的重定义方法
    Android:保存图片到Sqlite数据库
    Ubuntu 12.04 配置
    C# 实现天气预报
  • 原文地址:https://www.cnblogs.com/blogpro/p/11344071.html
Copyright © 2020-2023  润新知