Frage

Gibt es eine Möglichkeit in Delphi die aktuellen Anwendung exe Größe in einer oder zwei Zeilen Code zu bekommen?

War es hilfreich?

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:

  1. Öffnen Sie die Datei und die Größe des Stroms lesen. Dies kann erreicht werden, mit der ‚alten‘ Delphi Funktionen FileOpen und FileSize oder mit TFileStream (verwenden Sie die size Eigenschaft) oder mit Win32-API-Funktionen CreateFile und GetFileSize Funktion. (Platform abhängig!) Stellen Sie sicher, dass Sie die Datei mit Lesezugriff öffnen.
  2. In einem reinen Win32 envinronment Sie FindFirst verwenden können, um die Dateigröße zu erhalten. Sie können es von TSearchRec.FindData.nFileSizeLow lesen. Wenn Sie Dateien, die größer als 2 GB sind darauf vorbereitet sein wollen (sollten Sie sein) Sie auch die nFileSizeHigh Teil verwenden.
  3. In Delphi.NET Sie die System.IO.FileInfo verwenden können, wie folgt aus: FileInfo.Create(filename).Length (Einzeiler)
  4. In Linux Sie die lstat64 Funktion (Einheit Libc) verwenden können und die Größe von TStatBuf64.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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top