¿Hay alguna forma en Delphi para obtener el tamaño de la aplicación correcta en una o dos líneas de código?Obtenga el tamaño fácil de la aplicación
Respuesta
Justo para sonreír ... también puedes hacer esto con transmisiones Solo un poco más de 2 líneas de código. En general, el nombre del 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;
Desafortunadamente no es posible hacer eso 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. Lo puede encontrar en Application.ExeName
En general hay varias posibilidades para recuperar el tamaño de archivo:
- Abrir el archivo y lee el tamaño de la secuencia. Esto se puede lograr usando las 'viejas' funciones Delphi
FileOpen
yFileSize
, o conTFileStream
(use la propiedadsize
) o con las funciones de API de Win32CreateFile
yGetFileSize
función. (¡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 desdeTSearchRec.FindData.nFileSizeLow
. Si desea estar preparado para archivos de más de 2 GB (debe serlo), también debe usar la partenFileSizeHigh
. - En Delphi.NET puede utilizar el
System.IO.FileInfo
, así:FileInfo.Create(filename).Length
(de una sola línea) - en Linux Puede utilizar la función
lstat64
(UnidadLibc
) y obtener el tamaño deTStatBuf64.st_size
. (Revestimiento de dos si no cuentan la declaración de variables)
En el JCL library se pueden encontrar muchas funciones útiles, incluyendo una simple función que devuelve el tamaño de archivo de un nombre de archivo dado. (Se utiliza un método que se adapte a la plataforma dada)
No sé por qué esta es la respuesta con más votos. Esta publicación contiene varios ejemplos de cómo hacerlo utilizando solo comandos Delphi VCL nativos. – JosephStyons
Puede probar esto:
if FindFirst(ExpandFileName(Application.exename), faAnyFile, SearchRec) = 0 then
MessageDlg(Format('Tamaño: <%d>',[SearchRec.Size]), mtInformation, [mbOK], 0);
FindClose(SearchRec);
===============
Neftalí
Intenta envolver las dos primeras líneas en un "try..finally" y coloca FindClose en la parte "finally". Eso es más confiable. – onnodb
corrientes también se puede utilizar 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 }
No es tan pequeño como desee, pero no necesita asas. Utilizo esto en todos mis archivos y programas "SFX" 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 qué debería ser mejor que otros enfoques? No hay escasez de controladores en Windows ... – gabr
Simple. El identificador ya está asignado, punto 1, y aún mejor, esto le indica el tamaño de la aplicación, incluso si tiene datos agregados detrás de los datos de la aplicación. ¡Esto puede ser extremadamente importante de saber! –
El segundo punto es válido, estoy de acuerdo. – gabr
Por razones de compatibilidad en el futuro, usted debe elegir una aplicación que no requiere punteros o funciones API de Windows siempre que sea posible. La solución basada en TFileStream proporcionada por skamradt se ve bien para mí.
Pero ... No debe preocuparse demasiado si la rutina es de 1 o 10 líneas de código, porque de todos modos va a encapsularlo en una función que toma un nombre de archivo como parámetro y devuelve un Int64, y póngalo en su biblioteca personal de código reutilizable. Entonces puede llamarlo así:
GetMyFileSize (Application.ExeName);
quisiera modificar el código proporcionado por skamradt, para que sea dos líneas de código como usted pidió ;-)
with tFilestream.create(paramstr(0),fmOpenRead or fmShareDenyNone) do
ShowMessage(IntToStr(size));
pero yo preferiría utilizar el código como skamradt escribió, porque es más seguro
Lo más corto que pude hacer. Tenga en cuenta que la Clasifique es en bytes, por lo que para kilobytes, se divide por 1024.
procedure TForm1.Button1Click(Sender: TObject);
begin
with TFileStream.Create(Application.ExeName,fmShareDenyNone) do
ShowMessage(FloatToStr(Size/1024));
end;
Salida this link.
No estoy seguro de por qué esto justificó un voto negativo; ¿Alguien puede señalar un problema específico con este código? – JosephStyons
Podría ser porque no está liberando el TFileStream nuevamente. – Jeff
uses IdGlobalProtocols;
var
ExeSize: Int64;
begin
ExeSize := FileSizeByName(ParamStr(0));
// or
ExeSize := FileSizeByName(Application.ExeName);
end;
- 1. Android, obtenga el tamaño y la fecha de la aplicación instalada
- 2. Obtenga el tamaño de una matriz 2D
- 3. Obtenga el tamaño preferido de la distribución de flujo multilínea
- 4. ¿Obtenga programáticamente el tamaño de la línea de caché?
- 5. Obtenga el tamaño de la respuesta HTTP en Java
- 6. Obtenga el tiempo transcurrido desde el inicio de la aplicación
- 7. Android Obtenga el Directorio de datos de la aplicación 'Inicio'
- 8. Android: Obtenga el nombre de aplicación de la intención
- 9. PowerShell: obtenga el ID de proceso de la aplicación llamada
- 10. Android y Dalvik: obtenga el tamaño de un objeto
- 11. iPhone obtenga ancho y tamaño de la imagen
- 12. Obtenga el marco ampliado de UIScrollView relativo al tamaño original
- 13. La manera más fácil de cambiar la fuente y el tamaño de fuente
- 14. Obtenga la ID de Google utilizada para descargar la aplicación
- 15. Obtenga la versión de Django para la aplicación
- 16. Disminuir el tamaño de la aplicación GUI de Qt
- 17. Obtenga el límite máximo de tamaño de la textura OpenGL ES 2.0 en Android
- 18. ¿Forma fácil de obtener el tamaño de la carpeta (ObjC/Cocoa)?
- 19. Obtenga un tamaño de pantalla efectivo de Java
- 20. ¿Cómo obtener el tamaño del widget de la aplicación?
- 21. Obtenga referrer después de instalar la aplicación desde Android Market
- 22. ¿Forma fácil de establecer CurrentCulture para toda la aplicación?
- 23. ¿La forma más fácil de capturar el tamaño del archivo remoto en PHP?
- 24. ¿Cuál es la forma más fácil de determinar el tamaño de los paquetes .app de iOS durante el desarrollo?
- 25. ¿Cuál es la forma más fácil de usar el código fuente C en una aplicación Java?
- 26. Obtenga el tamaño medido y la posición del mapa de bits en el lienzo después de la transformación 2D
- 27. Compartir la memoria entre el servicio de Windows y la aplicación, ¿qué es más fácil?
- 28. Obtenga HttpServletRequest en la aplicación Jax Rs/Appfuse?
- 29. Android: obtenga el nombre del archivo adjunto en mi aplicación
- 30. iPhone límite de tamaño aplicación
Bien hecho. Creo que tu respuesta es más legible que la de Mohammed Nasman o la mía. – JosephStyons