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;
Delphi从EXE或DLL获取ICO图标
WinAPI: ExtractIcon - 获取 EXE、DLL 或 ICO 文件中的图标
//声明:
ExtractIcon(
hInst: HINST; {调用函数的程序实例}
lpszExeFileName: PChar; {文件路径; 文件可以是 *.exe、*.dll、*.ico}
nIconIndex: UINT {图标索引}
): HICON; {返回图标句柄; 索引为 0 时返回第一个图标句柄; 索引为 #FFFFFFFF 时返回图标总数}
//举例:
例2:
获取文件大小
大概有这些方法可以获得文件大小
FileSizeByName(需要引用IdGlobal单元)
GetFileSize
FileSize(不能获得正在使用的文件大小)
FileSeek
TFileStream.Size
下面是使用例子
1。FileSizeByName(需要引用IdGlobal单元)
begin if OpenDialog1.Execute then begin ShowMessage(IntToStr(FileSizeByName(OpenDialog1.Filename))); end;
2。GetFileSize
var FileHandle:integer; begin if OpenDialog1.Execute then begin FileHandle := FileOpen(OpenDialog1.FileName, 0); ShowMessage(IntToStr(GetFileSize(FileHandle, nil))); FileClose(FileHandle); end;
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;
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;
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;
另在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;
递归枚举目录下所有文件并显示大小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;
获取程序版本及时间
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;
文件版本及时间
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;
获取和修改文件的时间
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;
有了上面的函数支持,我们就可以获取一个文件的时间信息了。以下是一个简单的例子:
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;
设置文件的时间要复杂一些,这里介绍利用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;
以上简单介绍了文件时间属性的修改方法,请注意:修改文件时间的范围是从公元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.
这样我们使用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;
获取文件图标、文件名、文件类型、文件属性,图标加载
来源 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,说明如下:
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方法清除已加载的图标,常在需要刷新时使用。 这种方法只是取扩展名所示文件的图标,完全完全不需要文件存在!!!!
读取 文件大小、类型、以及修改时间
取文件修改时间
获取文件或文件夹属性和修改属性
1、修改隐藏属性的代码片段
2、修改取消隐藏属性的代码片段
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取消只读文件
1. 在interface下的uses中引用filectrl单元
2. 首先取文件属性
3. 设置文件属性(如设置归档属性 -> faArchive )
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);
获取文件的版本等信息
如何用Delphi编程读出一个DLL文件的版本号,请给示例
好,给几个函数还不行,那就给段代码吧:
如何获取一个可执行文件的版本号?
//得到文件版本
在Delphi中获取和修改文件的时间
本文介绍了在Delphi中利用系统函数和Windows API函数调用来获取和修改文件的时间信息的方法。
熟悉Windows 95/98的朋友一定经常会用单击鼠标右键的方法来查看所选定的文件的属性信息。在属性菜单中会列出该文件的创建时间、修改时间和访问时间。这些信息常常是很有用的,它们的设置一般都是由操作系统(也就是由Dos/Windows等等)自动完成的,不会让用户轻易修改。
这里,我向大家介绍在Delphi中如何实现文件时间的获取和修改方法。Delphi中提供了很完备的Windows API函数的调用接口,可以方便的进行高级Windows编程。利用Delphi中的FindFirst函数可以得到一个文件的属性记录,该记录中的FindData域中就记载了详细的文件时间信息。然而遗憾的是,FindData中的时间信息是不能直接得到的。因此,有人(编者按:很遗憾不知此人姓名)编写了一个转换函数来完成文件时间格式的转换。下面给出了具体的实现方法,仅供参考:
设置文件的时间要复杂一些,这里介绍利用Delphi中的DataTimePicker组件来辅助完成这一复杂的操作。下面的例子利用了四个DataTimePicker组件来完成文件创建时间和修改时间的设置。注意:文件的访问时间用修改时间来代替。使用下面的例子时,请在您的Form上添加四个DataTimePicker组件。其中第一和第三个DataTimePicker组件中的Kind设置为dtkDate,第二个和第四个DataTimePicker组件中的Kind设置为dtkTime.
以上简单介绍了文件时间属性的修改方法,请注意:修改文件时间的范围是从公元1792年9月19日开始的,上限可以达到公元2999年或更高。另外,请不要将此技术用于破坏他人文件等非正当途径。
获取文件创建,修改时间
得到文件创建时间,修改时间,访问时间
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.