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. 【Flutter学习】页面布局之列表和表格处理

    一,概述 Flutter中拥有30多种预定义的布局widget,常用的有Container.Padding.Center.Flex.Row.Colum.ListView.GridView.按照< ...

  2. 大碗宽面Alpha第九周会议总结

    软件工程每周博客: 本周二我们进行了小组会议,对正在做的评课网站——海大优选进行了整体分析和明确分工.首先我们对整体网页进行了需求分析和框架分析,然后进行了分工,前端同学两人,后端同学两人,文档同学一 ...

  3. eclipse开发安卓 发短信打电话发送邮件功能

    1.在mainfiest中添加   //添加拨打电话的功能    <uses-permission android:name="android.permission.CALL_PHON ...

  4. ShellListView

    過濾ShellListView顯示的檔案 有關這方面的元件你可以在Win3.中找到相關元件 你可以使用四個元件搭配應該就可以你所需要的功能 DriveComboBox1.FilterComboBox1 ...

  5. 送礼物(二分加双向DFS)

    题目链接 题意:给你n个礼物重量,给你一个M力量,看你一次性搬动不超过M的礼物重量. 思路:看似背包,但M太大.所以要用DFS,但n也有45,所以考虑双向DFS先搜前半部分满足情况的所有重量,然后去重 ...

  6. Linux桌面与命令行切换

    1.首先在安装Linux的时候是选则Desktop桌面方式安装 2.切换命令 2.1快捷键:Ctrl+Alt+F1    切换到桌面模式 Ctrl+Alt+F3    切换到命令行模式

  7. c 语言 volatile 关键字

    一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没 ...

  8. HTML5: HTML5 MathML

    ylbtech-HTML5: HTML5 MathML 1.返回顶部 1. HTML5 MathML HTML5 可以在文档中使用 MathML 元素,对应的标签是 <math>...&l ...

  9. 用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表

    目录 目录 前文列表 扩展阅读 定义数据模型 models 创建表 前文列表 用 Flask 来写个轻博客 (1) - 创建项目 用 Flask 来写个轻博客 (2) - Hello World! 用 ...

  10. EmWin 如何显示汉字 不用在文件中使用编码

    1. Font Converter for emWin 生成C文件字库 1.1 新建文件 1.2 选择字体 1.3 为了减小C文件体积,这里只加入自己需要的汉字,先把所有字体取消选择. 1.4 新建一 ...