Delphi中有没有办法在一行或两行代码中获取当前应用程序的exe大小?
答案 0 :(得分:10)
只是为了咧嘴笑......你也可以用溪流做这个只是略多于2行代码。通常,包含路径的应用程序文件名也存储在Paramstr(0)中。
var
fs : tFilestream;
begin
fs := tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone);
try
result := fs.size;
finally
fs.free;
end;
end;
答案 1 :(得分:5)
它不是你想要的那么小,但它不需要手柄。我在所有必须知道其大小的“SFX”归档程序和程序中使用它。 IIRC它需要Windows单元。
function GetExeSize: cardinal; var p: pchar; i, NumSections: integer; const IMAGE_PE_SIGNATURE = $00004550; begin result := 0; p := pointer(hinstance); inc(p, PImageDosHeader(p)._lfanew + sizeof(dword)); NumSections := PImageFileHeader(p).NumberOfSections; inc(p,sizeof(TImageFileHeader)+ sizeof(TImageOptionalHeader)); for i := 1 to NumSections do begin with PImageSectionHeader(p)^ do if PointerToRawData+SizeOfRawData > result then result := PointerToRawData+SizeOfRawData; inc(p, sizeof(TImageSectionHeader)); end; end;
答案 2 :(得分:4)
为了将来的兼容性,您应该尽可能选择不需要指针或Windows API函数的实现。由skamradt提供的基于TFileStream的解决方案对我来说很好。
但是......你不应该太担心例程是1行还是10行代码,因为无论如何你要将它封装在一个以文件名作为参数并返回Int64的函数中,把它放在你的可重用代码的个人库中。然后你就可以这样称呼它:
GetMyFileSize(Application.ExeName);
答案 3 :(得分:2)
不幸的是,如果不使用某些库而只使用一行或两行代码就无法做到这一点。
简单的部分是获取应用程序的exe文件。您可以在Application.ExeName
一般来说,检索文件大小有几种可能性:
FileOpen
和FileSize
,或TFileStream
(使用size
属性)或Win32 API函数CreateFile
来完成和GetFileSize
功能。 (平台依赖!)确保以只读访问权限打开文件。FindFirst
来获取文件大小。您可以从TSearchRec.FindData.nFileSizeLow
阅读。如果您想为大于2 GB的文件(您应该)做好准备,您还必须使用nFileSizeHigh
部分。 System.IO.FileInfo
,如下所示:FileInfo.Create(filename).Length
(单行)lstat64
功能(单元Libc
)并从TStatBuf64.st_size
获取大小。 (如果不计算变量声明,则为双线)在JCL library中,您可以找到许多有用的函数,包括一个返回给定文件名的文件大小的简单函数。 (它使用适合给定平台的方法)
答案 4 :(得分:2)
你可以试试这个:
if FindFirst(ExpandFileName(Application.exename), faAnyFile, SearchRec) = 0 then
MessageDlg(Format('Tamaño: <%d>',[SearchRec.Size]), mtInformation, [mbOK], 0);
FindClose(SearchRec);
===============
Neftalí
答案 5 :(得分:2)
Streams也可以在没有TFileStream变量的情况下使用:
with TFilestream.create(paramstr(0), fmOpenRead or fmShareDenyNone) do
aFileSize := Size;
Free;
end;
丑陋,是的。
我更喜欢使用DSiWin32中的DSiFileSize。它在内部使用CreateFile:
function DSiFileSize(const fileName: string): int64;
var
fHandle: DWORD;
begin
fHandle := CreateFile(PChar(fileName), 0, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if fHandle = INVALID_HANDLE_VALUE then
Result := -1
else try
Int64Rec(Result).Lo := GetFileSize(fHandle, @Int64Rec(Result).Hi);
finally CloseHandle(fHandle); end;
end; { DSiFileSize }
答案 6 :(得分:2)
uses IdGlobalProtocols;
var
ExeSize: Int64;
begin
ExeSize := FileSizeByName(ParamStr(0));
// or
ExeSize := FileSizeByName(Application.ExeName);
end;
答案 7 :(得分:0)
我想修改skamradt提供的代码,按照你的要求制作两行代码; - )
with tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone) do
ShowMessage(IntToStr(size));
但我更愿意使用 skamradt 写的代码,因为它更安全
答案 8 :(得分:0)
我能做到最短。请注意,.Size以字节为单位,因此对于千字节,除以1024。
procedure TForm1.Button1Click(Sender: TObject);
begin
with TFileStream.Create(Application.ExeName,fmShareDenyNone) do
ShowMessage(FloatToStr(Size/1024));
end;