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 = 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\080403A8\';
if VerQueryValue( pcBuffer,PChar(Find+'CompanyName'),pTemp,dwVersionSize ) then
VersionInfo.CompanyName:=PChar(pTemp)
else begin
Find := '\StringFileInfo\040904E4\';
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:='';
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, );
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, );
ShowMessage(IntToStr(FileSize(f)));
CloseFile(f);
end;

4。FileSeek

var
FileHandle:integer;
begin
if OpenDialog1.Execute then
begin
FileHandle := FileOpen(OpenDialog1.FileName, );
ShowMessage(IntToStr(FileSeek(FileHandle,,)));
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 > then
Result := FormatFloat('###,##0.00G', nSize / )
else if nSize > then
Result := FormatFloat('###,##0.00M', nSize / )
else if nSize > then
Result := FormatFloat('###,##00K', nSize / )
else
Result := FormatFloat('###,#0B', nSize);
if Length(Result) > then
if Result[] = '' then
Delete(Result, , );
end; function TForm1.GetFileSizeStr(fName:string):string;
var nSize: Integer;
begin
nSize := FileSizeByName(fName);
if nSize > then
Result := FormatFloat('###,##0.00G', nSize / )
else if nSize > then
Result := FormatFloat('###,##0.00M', nSize / )
else if nSize > then
Result := FormatFloat('###,##00K', nSize / )
else
Result := FormatFloat('###,#0B', nSize);
if Length(Result) > then
if Result[] = '' then
Delete(Result, , );
end; procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage('文件大小是: ' + GetFileSizeStr('d:\table.mdb'));
end;

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

unction FormatByteSize(const bytes: Int64): string;
const
B = ; //byte
KB = * B; //kilobyte
MB = * KB; //megabyte
GB = * 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 = then Exit;
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(FileName), , VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
Result := IntToStr(VerValue^.dwFileVersionMS shr ) + '.' +
IntToStr(VerValue^.dwFileVersionMS and $FFFF) + '.' +
IntToStr(VerValue^.dwFileVersionLS shr ) + '.' +
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 := ;
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 = then Exit;
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(FileName), , VerInfoSize, VerInfo);
VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
Result := IntToStr(VerValue^.dwFileVersionMS shr ) + '.' +
IntToStr(VerValue^.dwFileVersionMS and $FFFF) + '.' +
IntToStr(VerValue^.dwFileVersionLS shr ) + '.' +
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 := ;
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], );
{ 因为目标文件正在被使用等原因而导致失败 }
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 = ;
FileName : String = ;
var
Count : Integer;
begin
if( FileName <> EditFileName.Text ) then
begin
FileName := EditFileName.Text;
I := ;
end
else
if OperateString=MoveNextIcon then
Inc(I)
else
begin
if I> 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:=;
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>- then
begin
nIndex:=Integer(IconList.Objects[nIndex]);
Item.ImageIndex:=nIndex;
end else
begin
FillChar(sinfo, SizeOf(sinfo),);
SHGetFileInfo(PChar(extName),FILE_ATTRIBUTE_NORMAL,sinfo,SizeOf(sInfo),
SHGFI_USEFILEATTRIBUTES or SHGFI_ICON or SHGFI_SMALLICON);
if sinfo.hIcon> 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
:Time:=ffd.ftCreationTime;
:Time:=ffd.ftLastWriteTime;
: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:=;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Edit1.Text:=OpenDialog1.FileName;
Edit2.Text:=DateToStr(FGetFileTime(Edit1.Text,));
Edit3.Text:=DateToStr(FGetFileTime(Edit1.Text,));
Edit4.Text:=DateToStr(FGetFileTime(Edit1.Text,));
end;
end.

delphi 文件操作(信息获取)的更多相关文章

  1. delphi文件操作(比较全)

    Delphi中默认有input和output两个文件变量,使用可以不用定义,直接使用. 但: input:只读.output:只写.用时注意以免引起异常. 文件是由文件名标识的一组数据的集合,文件通常 ...

  2. Delphi 文件操作(路径、目录)

    Delphi利用系统环境变量获取常用系统目录 //譬如 %WINDIR% 是表示系统目录的系统变量, 可以这样获取: var s: string; begin s := GetEnvironmentV ...

  3. Delphi文件操作函数

    文件是同一种类型元素的有序集合,是内存与外设之间传输数据的渠道.文件的本质是一个数据流,所有的文件实际上是一串二进制序列.文件管理包括:1.文件操作.2.目录操作.3.驱动器操作.三部分. 1.常见文 ...

  4. delphi文件操作的总结

    csfinal90我的:收件箱资源博客空间设置|帮助|退出 首页 业界 移动 云计算 研发 论坛 博客 下载 更多 windzb的专栏 目录视图 摘要视图 订阅 IT俱乐部创始人杜鸿飞专访       ...

  5. FTP文件操作之获取文件列表

    前面已经介绍了很多关于FTP对文件的操作,今天再跟大家介绍一个获取文件列表的功能.这个功能应该算是最简单的一个了,它只是获取了一下文件信息,而没有进行实质上的数据传输. 下面是是该功能的核心代码:   ...

  6. OC文件操作、获取文件属性

    #import <Foundation/Foundation.h> //获取文件的属性 int main(int argc, const char * argv[]) { @autorel ...

  7. Delphi 文件操作(4)Reset

    procedure Reset(var F [: File; RecSize: Word ] );    { 作用:    对于文本文件,Reset过程将以只读方式打开文件,对于类型文件和无类型文件, ...

  8. 24篇Delphi文件操作文章

    http://www.cnblogs.com/keyvip/category/268043.html

  9. 使用 Python 进行稳定可靠的文件操作

    程序需要更新文件.虽然大部分程序员知道在执行I/O的时候会发生不可预期的事情,但是我经常看到一些异常幼稚的代码.在本文中,我想要分享一些如何在Python代码中改善I/O可靠性的见解. 考虑下述Pyt ...

随机推荐

  1. 【LeetCode 30】串联所有单词的子串

    题目链接 [题解] 开个字典树记录下所有的单词. 然后注意题目的已知条件 每个单词的长度都是一样的. 这就说明不会出现某个字符串是另外一个字符串的前缀的情况(除非相同). 所以可以贪心地匹配(遇到什么 ...

  2. sql 基础语法 alter用法和视图,透视

    --查询没有被删除的学生 alter table StuInfo --修改列属性 alter column isdelete bit null alter table StuInfo --删除列 dr ...

  3. TDengine陶建辉 自带聚光灯&BGM的半百少年

    TDengine,这款定位为“专为物联网而生的大数据平台”,引爆了2019年夏天的软件圈. 2019年7月12日,涛思数据宣布将TDengine的内核(存储和计算引擎)以及社区版100%开源. 201 ...

  4. intellij免费激活码

    IDEA官方下载地址:https://www.jetbrains.com/idea/nextversion/ IntelliJ IDEA 2019.2最新版本免费激活码 支持IDEA所有版本 正版授权 ...

  5. Newline required at end of file but not found

    在启动vue项目中遇到 解决方法 在main.js文件的最后一行加一个空行就可以了

  6. upc组队赛1 小C的数学问题【单调栈】(POJ2796)

    小C的数学问题 题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n ...

  7. 递归中,调用forEach方法问题

    1 function traverse(objNmae,obj,url){ url = url || objNmae; if(typeof obj === "object" ){ ...

  8. 卷积实现 python

    import sys h, w = input().strip().split() h = int(h) w = int(w) img = [] for i in range(h): line = s ...

  9. 开发效率优化之自动化构建系统Gradle(二)下篇

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从自定义 Gradle 插件开发来介绍自动化构建系统 ...

  10. leetcode.位运算.136只出现一次的元素-Java

    1. 具体题目 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明:你的算法应该具有线性时间复杂度. 你可以不使用额外空间来实现吗? 示例 1 ...