轻松获取应用程序exe大小

时间:2008-10-20 08:38:02

标签: delphi size

Delphi中有没有办法在一行或两行代码中获取当前应用程序的exe大小?

9 个答案:

答案 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

中找到它

一般来说,检索文件大小有几种可能性:

  1. 打开文件并读取流的大小。这可以使用'旧'Delphi函数FileOpenFileSize,或TFileStream(使用size属性)或Win32 API函数CreateFile来完成和GetFileSize功能。 (平台依赖!)确保以只读访问权限打开文件。
  2. 在纯Win32环境中,您可以使用FindFirst来获取文件大小。您可以从TSearchRec.FindData.nFileSizeLow阅读。如果您想为大于2 GB的文件(您应该)做好准备,您还必须使用nFileSizeHigh部分。
  3. 在Delphi.NET中,您可以使用System.IO.FileInfo,如下所示:FileInfo.Create(filename).Length(单行)
  4. 在Linux中,您可以使用lstat64功能(单元Libc)并从TStatBuf64.st_size获取大小。 (如果不计算变量声明,则为双线)
  5. 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;

查看this link.