Este es uno simple (creo).Función Delphi para mostrar el número de bytes como Windows
¿Hay un sistema incorporado en la función, o una función que alguien ha creado que se puede llamar desde Delphi, que mostrará una cantidad de bytes (por ejemplo, un tamaño de archivo), como muestra Windows en el cuadro de propiedades de un archivo?
p. Ej. Así es como cuadro de propiedades de Windows muestra diversos tamaños:
539 bytes (539 bytes)
35.1 KB (35,974 bytes)
317 MB (332,531,365 bytes)
2.07 GB (2,224,617,077 bytes)
La pantalla es inteligente acerca del uso de bytes, KB, MB o GB, y muestra sólo 3 dígitos significativos para el KB, MB y GB. Luego se deduce que al mostrar el número exacto de bytes entre paréntesis con comas que separan los miles. Es una pantalla muy bonita, bien pensada.
¿Alguien conoce esta función?
Editar: Estoy muy sorprendido de que no haya una función para esto.
Gracias por sus ideas útiles. He llegado a esto, que parece funcionar:
function BytesToDisplay(A:int64): string;
var
A1, A2, A3: double;
begin
A1 := A/1024;
A2 := A1/1024;
A3 := A2/1024;
if A1 < 1 then Result := floattostrf(A, ffNumber, 15, 0) + ' bytes'
else if A1 < 10 then Result := floattostrf(A1, ffNumber, 15, 2) + ' KB'
else if A1 < 100 then Result := floattostrf(A1, ffNumber, 15, 1) + ' KB'
else if A2 < 1 then Result := floattostrf(A1, ffNumber, 15, 0) + ' KB'
else if A2 < 10 then Result := floattostrf(A2, ffNumber, 15, 2) + ' MB'
else if A2 < 100 then Result := floattostrf(A2, ffNumber, 15, 1) + ' MB'
else if A3 < 1 then Result := floattostrf(A2, ffNumber, 15, 0) + ' MB'
else if A3 < 10 then Result := floattostrf(A3, ffNumber, 15, 2) + ' GB'
else if A3 < 100 then Result := floattostrf(A3, ffNumber, 15, 1) + ' GB'
else Result := floattostrf(A3, ffNumber, 15, 0) + ' GB';
Result := Result + ' (' + floattostrf(A, ffNumber, 15, 0) + ' bytes)';
end;
Esto es probablemente lo suficientemente bueno, pero ¿hay algo mejor?
StrFormatByteSize64 parece ser lo que Windows usa para la primera parte. Pero llamar a esa función desde Delphi requiere configurar un búfer, no es bonito. Para la segunda parte, floattostrf parece funcionar mejor que las soluciones en su enlace. – lkessler
como usted tiene alguna idea de cuánto tiempo puede ser la salida, utilice una matriz empaquetada [1..n] de char para el búfer. Pase @CharArray [1] como el puntero. –
Excelente consejo! (StrFormatByteSizeW) –