Pregunta

¿Hay una manera en Delphi de obtener el tamaño exe de la aplicación actual en una o dos líneas de código?

¿Fue útil?

Solución

Solo para sonrisas ... también puedes hacer esto con secuencias Solo un poco más de 2 líneas de código. En general, el nombre de archivo de la aplicación, incluida la ruta, también se almacena en Paramstr (0).

var
  fs : tFilestream;
begin
  fs := tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone);
  try
    result := fs.size;
  finally
    fs.free;
  end;
end;

Otros consejos

No es tan pequeño como quieres, pero no necesita manejadores. Lo uso en todos mis " SFX " Archivadores y programas que deben conocer su tamaño. IIRC requiere la unidad de 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;

Por motivos de compatibilidad futura, debe elegir una implementación que no requiera punteros o funciones de la API de Windows cuando sea posible. La solución basada en TFileStream proporcionada por skamradt me parece buena.

Pero ... No debe preocuparse demasiado si la rutina es de 1 o 10 líneas de código, porque la encapsulará de todos modos en una función que toma un nombre de archivo como parámetro y devuelve un Int64, y Ponlo en tu biblioteca personal de código reutilizable. Entonces puedes llamarlo así:

GetMyFileSize (Application.ExeName);

Puedes probar esto:

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

===============
Neftalí

Las secuencias también se pueden usar sin una variable TFileStream:

with TFilestream.create(paramstr(0), fmOpenRead or fmShareDenyNone) do 
  aFileSize := Size;
  Free;
end;

Feo, sí.

Prefiero usar DSiFileSize desde DSiWin32 . Utiliza CreateFile internamente:

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 }

Desafortunadamente, no es posible hacerlo con solo una o dos líneas de código sin usar alguna biblioteca.

La parte fácil es obtener el archivo exe de la aplicación. Puede encontrarlo en Application.ExeName

En general, hay varias posibilidades para recuperar el tamaño del archivo:

  1. Abra el archivo y lea el tamaño de la secuencia. Esto se puede lograr usando las funciones Delcode "antiguas" de FileOpen y FileSize , o con TFileStream (use el tamaño de propiedad) o con las funciones de la API de Win32 CreateFile y GetFileSize . (¡Depende de la plataforma!) Asegúrese de abrir el archivo con acceso de solo lectura.
  2. En un entorno Win32 puro, puede usar FindFirst para obtener el tamaño del archivo. Puede leerlo en TSearchRec.FindData.nFileSizeLow . Si desea estar preparado para archivos de más de 2 GB (debería estarlo) debe usar también la parte nFileSizeHigh .
  3. En Delphi.NET puede usar System.IO.FileInfo , así: FileInfo.Create (filename) .Length (one-liner)
  4. En Linux puede usar la función lstat64 (Unidad Libc ) y obtener el tamaño en TStatBuf64.st_size . (dos líneas si no cuenta la declaración de variable)

En la biblioteca JCL puede encontrar muchas funciones útiles, incluida una función simple que devuelve el tamaño de archivo de un nombre de archivo dado. (Utiliza un método que se adapta a la plataforma dada)

uses IdGlobalProtocols;

var
  ExeSize: Int64;
begin
  ExeSize := FileSizeByName(ParamStr(0)); 
  // or
  ExeSize := FileSizeByName(Application.ExeName);
end;

Me gustaría modificar el código provisto por skamradt, para que sea dos líneas de código como usted solicitó ;-)

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

pero preferiría usar el código como escribió skamradt , porque es más seguro

Lo más corto que pude hacer. Tenga en cuenta que el Tamaño está en bytes, por lo que para los kilobytes, divídalo por 1024.

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

Consulte este enlace.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top