7

Delphi で、1 行または 2 行のコードで現在のアプリケーションの exe サイズを取得する方法はありますか?

4

9 に答える 9

11

ちょっと笑ってください...ストリームでもこれを行うことができます 2行強のコードだけです。通常、パスを含むアプリケーション ファイル名も Paramstr(0) に格納されます。

var
  fs : tFilestream;
begin
  fs := tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone);
  try
    result := fs.size;
  finally
    fs.free;
  end;
end;
于 2008-10-20T14:34:36.373 に答える
5

それはあなたが望むほど小さくはありませんが、それはハンドルを必要としません。私はこれを、サイズを知る必要のあるすべての「SFX」アーカイバとプログラムで使用しています。IIRCにはWindowsユニットが必要です。

関数GetExeSize:枢機卿;
var
  p:pchar;
  i、NumSections:整数;
const
  IMAGE_PE_SIGNATURE = $ 00004550;
始める
  結果:= 0;
  p:=ポインター(ヒント);
  inc(p、PImageDosHeader(p)._ lfanew + sizeof(dword));
  NumSections:= PImageFileHeader(p).NumberOfSections;
  inc(p、sizeof(TImageFileHeader)+ sizeof(TImageOptionalHeader));
  for i:= 1 to NumSections do
  始める
    PImageSectionHeader(p)を使用して
      PointerToRawData +SizeOfRawData>の結果の場合
        結果:= PointerToRawData + SizeOfRawData;
    inc(p、sizeof(TImageSectionHeader));
  終わり;
終わり;
于 2008-10-20T15:27:50.477 に答える
4

将来の互換性のために、可能な場合はポインターやWindowsAPI関数を必要としない実装を選択する必要があります。skamradtが提供するTFileStreamベースのソリューションは私には良さそうです。

しかし...ルーチンが1行または10行のコードであるかどうかについては、あまり心配する必要はありません。とにかく、ファイル名をパラメーターとして受け取り、Int64を返す関数にカプセル化して、再利用可能なコードの個人用ライブラリ。次に、次のように呼び出すことができます。

GetMyFileSize(Application.ExeName);

于 2008-10-21T00:14:07.000 に答える
2

あなたはこれを試すことができます:

  if FindFirst(ExpandFileName(Application.exename), faAnyFile, SearchRec) = 0 then
    MessageDlg(Format('Tamaño: <%d>',[SearchRec.Size]), mtInformation, [mbOK], 0);
  FindClose(SearchRec);

===============
ネフタリ

于 2008-10-20T09:18:29.740 に答える
2

残念ながら、ライブラリを使用せずに 1 行または 2 行のコードだけでそれを行うことはできません。

簡単な部分は、アプリケーションの exe ファイルを取得することです。あなたはそれを見つけることができますApplication.ExeName

一般に、ファイル サイズを取得する方法はいくつかあります。

  1. ファイルを開き、ストリームのサイズを読み取ります。これは、「古い」Delphi 関数FileOpenおよびFileSize、または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関数 (Unit Libc) を使用して、からサイズを取得できますTStatBuf64.st_size。(変数宣言を数えない場合は2行)

JCL ライブラリには、特定のファイル名のファイル サイズを返す単純な関数など、多くの便利な関数があります。(指定されたプラットフォームに適した方法を使用します)

于 2008-10-20T09:02:50.397 に答える
2

ストリームは、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 }
于 2008-10-20T15:07:56.977 に答える
2
uses IdGlobalProtocols;

var
  ExeSize: Int64;
begin
  ExeSize := FileSizeByName(ParamStr(0)); 
  // or
  ExeSize := FileSizeByName(Application.ExeName);
end;
于 2012-08-04T11:29:17.080 に答える
0

私ができる最短。.Size はバイト単位なので、キロバイトの場合は 1024 で割ります。

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TFileStream.Create(Application.ExeName,fmShareDenyNone) do
    ShowMessage(FloatToStr(Size/1024));
end;

このリンクをチェックしてください。

于 2008-10-21T12:47:38.570 に答える
0

skamradt から提供されたコードを変更して、要求どおりに 2 行のコードにしたいと思います ;-)

  with tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone) do
    ShowMessage(IntToStr(size));

しかし、より安全なので、skamradtが書いたコードを使用したいと思います

于 2008-10-21T12:11:53.803 に答える