Holen Anwendung exe Größe leicht
Frage
Gibt es eine Möglichkeit in Delphi die aktuellen Anwendung exe Größe in einer oder zwei Zeilen Code zu bekommen?
Lösung
Nur für grins ... Sie können auch mit Strömen nur etwas mehr als 2 Zeilen Code tun. Im Allgemeinen ist die Anwendung Dateiname einschließlich Pfad wird auch in ParamStr (0) gespeichert.
var
fs : tFilestream;
begin
fs := tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone);
try
result := fs.size;
finally
fs.free;
end;
end;
Andere Tipps
Es ist nicht so klein, wie Sie wollen, aber es braucht keine Griffe. Ich benutze dies in allen meinen „SFX“ archivers und Programme, die ihre Größe kennen müssen. IIRC es erfordert die Windows-Einheit.
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;
Aus Gründen der zukünftigen Kompatibilität, sollten Sie eine Implementierung wählen, die Zeiger oder Windows-API-Funktionen nicht erforderlich, wenn möglich. Die TFileStream basierte Lösung von skamradt zur Verfügung gestellt sieht gut aus für mich.
Aber ... Sie sollten nicht zu viel Sorgen darüber, ob die Routine 1 oder 10 Zeilen Code, weil Sie es kapseln ohnehin in einer Funktion gehst, die einen Dateinamen als Parameter und gibt einen Int64, und steckt es in Ihrer persönlichen Bibliothek wiederverwendbaren Code. Dann können Sie es wie so nennen:
GetMyFileSize (Application.ExeName);
Sie können versuchen, diese:
if FindFirst(ExpandFileName(Application.exename), faAnyFile, SearchRec) = 0 then
MessageDlg(Format('Tamaño: <%d>',[SearchRec.Size]), mtInformation, [mbOK], 0);
FindClose(SearchRec);
===============
Neftalí
Streams können auch ohne TFileStream Variable verwendet werden:
with TFilestream.create(paramstr(0), fmOpenRead or fmShareDenyNone) do
aFileSize := Size;
Free;
end;
hässlich, ja.
Ich ziehe mit DSiFileSize von DSiWin32 . Es verwendet intern 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 }
Leider ist es nicht möglich, das zu tun mit nur einem oder zwei Zeilen Code ohne irgendeine Bibliothek.
Der einfache Teil ist immer die EXE-Datei der Anwendung. Sie können es in Application.ExeName
finden
In der Regel gibt es mehrere Möglichkeiten zum Abrufen der Dateigröße:
- Öffnen Sie die Datei und die Größe des Stroms lesen. Dies kann erreicht werden, mit der ‚alten‘ Delphi Funktionen
FileOpen
undFileSize
oder mitTFileStream
(verwenden Sie diesize
Eigenschaft) oder mit Win32-API-FunktionenCreateFile
undGetFileSize
Funktion. (Platform abhängig!) Stellen Sie sicher, dass Sie die Datei mit Lesezugriff öffnen. - In einem reinen Win32 envinronment Sie
FindFirst
verwenden können, um die Dateigröße zu erhalten. Sie können es vonTSearchRec.FindData.nFileSizeLow
lesen. Wenn Sie Dateien, die größer als 2 GB sind darauf vorbereitet sein wollen (sollten Sie sein) Sie auch dienFileSizeHigh
Teil verwenden. - In Delphi.NET Sie die
System.IO.FileInfo
verwenden können, wie folgt aus:FileInfo.Create(filename).Length
(Einzeiler) - In Linux Sie die
lstat64
Funktion (EinheitLibc
) verwenden können und die Größe vonTStatBuf64.st_size
erhalten. (Zweizeiler, wenn Sie nicht die Deklaration von Variablen count)
In der JCL-Bibliothek viele nützliche Funktionen finden können, eine einfache Funktion enthält, die die Dateigröße wieder von eine bestimmte Dateinamen. (Es verwendet ein Verfahren, das die gegebene Plattform entspricht)
uses IdGlobalProtocols;
var
ExeSize: Int64;
begin
ExeSize := FileSizeByName(ParamStr(0));
// or
ExeSize := FileSizeByName(Application.ExeName);
end;
Ich möchte den Code von skamradt vorgesehen ändern, ist es zwei Codezeilen zu machen, wie Sie verlangten; -)
with tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone) do
ShowMessage(IntToStr(size));
, aber ich würde den Code wie skamradt verwenden möchten schrieb, weil es sicherer
Kürzeste ich tun konnte. Beachten Sie, dass die .Size in Bytes, also für Kilobyte, Division durch 1024.
procedure TForm1.Button1Click(Sender: TObject);
begin
with TFileStream.Create(Application.ExeName,fmShareDenyNone) do
ShowMessage(FloatToStr(Size/1024));
end;
Schauen Sie sich diesen Link.