2011-06-02 12 views
18

¿Cómo puedo obtener el tamaño de archivo preciso en MB? He intentado esto:Obteniendo un tamaño de archivo preciso en megabytes?

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

+5

separado del flotador vs problema int - 1024000 es realmente la constante que desea? Por lo general, MB es 2^20, que es 1048576. –

+0

Gracias por la nota. Lo arreglé en mi código. – emurad

+0

Según la cantidad de funciones que desee, la fuente para 'ActionView :: Helpers :: NumberHelper # number_to_human_size' de Rails es una buena implementación de referencia. http://apidock.com/rails/ActionView/Helpers/NumberHelper/number_to_human_size – captainpete

Respuesta

26

Probar:

compressed_file_size = File.size("Compressed/#{project}.tar.bz2").to_f/2**20 
formatted_file_size = '%.2f' % compressed_file_size 

de una sola línea:

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 de encordado: http://ruby-doc.org/core-1.9/classes/String.html#M000207


BTW: Yo prefiero "MiB" en lugar de "Mo" si uso cálculos Base2 (véase: http://en.wikipedia.org/wiki/Mebibyte)

7

Estás haciendo división entera (que cae por la parte fraccionaria). Intenta dividir por 1024000.0, así que Ruby sabe que quieres hacer matemática de coma flotante.

+0

Ni siquiera uso Ruby y eso era exactamente lo que iba a sugerir. – JAB

+0

Esto también. Me está dando 2.8679921875 MB Sólo quiero 2.86 MB – emurad

+0

Solo llamo round (3) – 0112

2

Probar:

compressed_file_size = File.size("Compressed/#{project}.tar.bz2").to_f/1024000 
+0

Eso me da 2.8679921875 MB Solo quiero 2.86 MB – emurad

+2

Puede usar compressed_file_size.round (2) o '.2f'% comprimed_file_size en la salida – Hck

+0

No lo hice 't get' .2f '% compressed_file_size en la salida. Por favor aclara – emurad

1

Usted puede encontrar una función de formateo útil (pretty print file size), 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 

probarlo,

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" 
} 

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 
Cuestiones relacionadas