ruby - que - ¿Obtener el tamaño exacto del archivo en megabytes?
cual es el tamaño maximo para enviar un archivo en whatsapp (4)
Es posible que encuentre útil una función de formato ( tamaño de archivo de impresión bonito ), y aquí está mi ejemplo,
def format_mb(size)
conv = [ ''b'', ''kb'', ''mb'', ''gb'', ''tb'', ''pb'', ''eb'' ];
scale = 1024;
ndx=1
if( size < 2*(scale**ndx) ) then
return "#{(size)} #{conv[ndx-1]}"
end
size=size.to_f
[2,3,4,5,6,7].each do |ndx|
if( size < 2*(scale**ndx) ) then
return "#{''%.3f'' % (size/(scale**(ndx-1)))} #{conv[ndx-1]}"
end
end
ndx=7
return "#{''%.3f'' % (size/(scale**(ndx-1)))} #{conv[ndx-1]}"
end
Pruébalo,
tries = [ 1,2,3,500,1000,1024,3000,99999,999999,999999999,9999999999,999999999999,99999999999999,3333333333333333,555555555555555555555]
tries.each { |x|
print "size #{x} -> #{format_mb(x)}/n"
}
Lo que produce,
size 1 -> 1 b
size 2 -> 2 b
size 3 -> 3 b
size 500 -> 500 b
size 1000 -> 1000 b
size 1024 -> 1024 b
size 3000 -> 2.930 kb
size 99999 -> 97.655 kb
size 999999 -> 976.562 kb
size 999999999 -> 953.674 mb
size 9999999999 -> 9.313 gb
size 999999999999 -> 931.323 gb
size 99999999999999 -> 90.949 tb
size 3333333333333333 -> 2.961 pb
size 555555555555555555555 -> 481.868 eb
¿Cómo puedo obtener el tamaño exacto del archivo en MB? Intenté esto:
compressed_file_size = File.size("Compressed/#{project}.tar.bz2") / 1024000
puts "file size is #{compressed_file_size} MB"
Pero cortó el 0.9 y mostró 2 MB en lugar de 2.9 MB.
Estás haciendo una división entera (que deja caer la parte fraccionaria). Intenta dividir por 1024000.0 para que Ruby sepa que quieres hacer cálculos de punto flotante.
Tratar:
compressed_file_size = File.size("Compressed/#{project}.tar.bz2").to_f / 1024000
Tratar:
compressed_file_size = File.size("Compressed/#{project}.tar.bz2").to_f / 2**20
formatted_file_size = ''%.2f'' % compressed_file_size
Un trazador de líneas:
compressed_file_size = ''%.2f'' % (File.size("Compressed/#{project}.tar.bz2").to_f / 2**20)
o:
compressed_file_size = (File.size("Compressed/#{project}.tar.bz2").to_f / 2**20).round(2)
Más información sobre %
-operator of String: http://ruby-doc.org/core-1.9/classes/String.html#M000207
BTW: Prefiero "MiB" en lugar de "MB" si uso los cálculos de base2 (consulte: http://en.wikipedia.org/wiki/Mebibyte )