Delphi で、1 行または 2 行のコードで現在のアプリケーションの exe サイズを取得する方法はありますか?
9 に答える
ちょっと笑ってください...ストリームでもこれを行うことができます 2行強のコードだけです。通常、パスを含むアプリケーション ファイル名も Paramstr(0) に格納されます。
var
fs : tFilestream;
begin
fs := tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone);
try
result := fs.size;
finally
fs.free;
end;
end;
それはあなたが望むほど小さくはありませんが、それはハンドルを必要としません。私はこれを、サイズを知る必要のあるすべての「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)); 終わり; 終わり;
将来の互換性のために、可能な場合はポインターやWindowsAPI関数を必要としない実装を選択する必要があります。skamradtが提供するTFileStreamベースのソリューションは私には良さそうです。
しかし...ルーチンが1行または10行のコードであるかどうかについては、あまり心配する必要はありません。とにかく、ファイル名をパラメーターとして受け取り、Int64を返す関数にカプセル化して、再利用可能なコードの個人用ライブラリ。次に、次のように呼び出すことができます。
GetMyFileSize(Application.ExeName);
あなたはこれを試すことができます:
if FindFirst(ExpandFileName(Application.exename), faAnyFile, SearchRec) = 0 then
MessageDlg(Format('Tamaño: <%d>',[SearchRec.Size]), mtInformation, [mbOK], 0);
FindClose(SearchRec);
===============
ネフタリ
残念ながら、ライブラリを使用せずに 1 行または 2 行のコードだけでそれを行うことはできません。
簡単な部分は、アプリケーションの exe ファイルを取得することです。あなたはそれを見つけることができますApplication.ExeName
一般に、ファイル サイズを取得する方法はいくつかあります。
- ファイルを開き、ストリームのサイズを読み取ります。これは、「古い」Delphi 関数
FileOpen
およびFileSize
、またはTFileStream
(size
プロパティを使用) または Win32 API 関数CreateFile
およびGetFileSize
関数を使用して実現できます。(プラットフォームによって異なります!) ファイルは必ず読み取り専用アクセスで開いてください。 - 純粋な Win32 環境では
FindFirst
、ファイル サイズを取得するために使用できます。から読めますTSearchRec.FindData.nFileSizeLow
。2 GB を超えるファイルに備えたい場合 (そうすべきです)、そのnFileSizeHigh
部分も使用する必要があります。 - Delphi.NET では、次のように を使用できます
System.IO.FileInfo
:FileInfo.Create(filename).Length
(ワンライナー) - Linux では、
lstat64
関数 (UnitLibc
) を使用して、からサイズを取得できますTStatBuf64.st_size
。(変数宣言を数えない場合は2行)
JCL ライブラリには、特定のファイル名のファイル サイズを返す単純な関数など、多くの便利な関数があります。(指定されたプラットフォームに適した方法を使用します)
ストリームは、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 }
uses IdGlobalProtocols;
var
ExeSize: Int64;
begin
ExeSize := FileSizeByName(ParamStr(0));
// or
ExeSize := FileSizeByName(Application.ExeName);
end;
私ができる最短。.Size はバイト単位なので、キロバイトの場合は 1024 で割ります。
procedure TForm1.Button1Click(Sender: TObject);
begin
with TFileStream.Create(Application.ExeName,fmShareDenyNone) do
ShowMessage(FloatToStr(Size/1024));
end;
このリンクをチェックしてください。
skamradt から提供されたコードを変更して、要求どおりに 2 行のコードにしたいと思います ;-)
with tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone) do
ShowMessage(IntToStr(size));
しかし、より安全なので、skamradtが書いたコードを使用したいと思います