Obtener la aplicación de tamaño exe fácilmente
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?
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:
- Abra el archivo y lea el tamaño de la secuencia. Esto se puede lograr usando las funciones Delcode "antiguas" de
FileOpen
yFileSize
, o conTFileStream
(use el tamaño deCreateFile
yGetFileSize
. (¡Depende de la plataforma!) Asegúrese de abrir el archivo con acceso de solo lectura. - En un entorno Win32 puro, puede usar
FindFirst
para obtener el tamaño del archivo. Puede leerlo enTSearchRec.FindData.nFileSizeLow
. Si desea estar preparado para archivos de más de 2 GB (debería estarlo) debe usar también la partenFileSizeHigh
. - En Delphi.NET puede usar
System.IO.FileInfo
, así:FileInfo.Create (filename) .Length
(one-liner) - En Linux puede usar la función
lstat64
(UnidadLibc
) y obtener el tamaño enTStatBuf64.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.