2009-11-25 15 views
10

¿Alguien sabe de una forma de obtener una actualización de estado de la biblioteca Net :: FTP de ruby ​​mientras se descarga un archivo? Estoy intentando implementar una interfaz web que muestre una barra de progreso para el porcentaje restante al descargar un archivo de un servidor ftp remoto.Ruby Net :: FTP Progress Bar

Respuesta

34

Para referencia futura - yo nos topamos con una solución:

filesize = ftp.size(filename) 
transferred = 0 
p "Beginning download, file size: #{filesize}" 
ftp.getbinaryfile(filename, "#{SOURCE_IMPORT_DIRECTORY}/#{filename}", 1024) { |data| 
    transferred += data.size 
    percent_finished = ((transferred).to_f/filesize.to_f)*100 
    p "#{percent_finished.round}% complete" 
} 
ftp.close 
+0

Este es un hilo antiguo, pero puede otorgarse la respuesta. Buen trabajo. –

+0

Acepto, gracias por este ejemplo – chrisan

0

he construido en excelente enfoque @ de smnirven para un poco el progreso menos ruidoso con la progresión de 100 puntos:

filesize = ftp.size(filename) 
transferred = 0 
notified = false 

ftp.getbinaryfile(filename, full_local_path, 1024) do |data| 
    transferred += data.size 
    percent_finished = (((transferred).to_f/filesize.to_f)*100) 
    if percent_finished.to_s.include?('.0') 
    print "." if notified == false 
    notified = true 
    else 
    notified = false 
    end 
end 
ftp.close 

de salida:

[progress] Downloading CBSA boundaries... 
.......................................................................... 
.......................... 
[progress] Finished! 
4

Expandí las respuestas dadas por @smnirven y @theoretick para crear un si fijo barra de progreso ze que se llena a medida que completa para que pueda tener una idea visual de cómo completa el progreso es:

def getprogress(ftp,file,local_path) 
    transferred = 0 
    filesize = ftp.size(file) 
    ftp.get(file, local_path, 1024) do |data| 
    transferred += data.size 
    percent = ((transferred.to_f/filesize.to_f)*100).to_i 
    finished = ((transferred.to_f/filesize.to_f)*30).to_i 
    not_finished = 30 - finished 
    print "\r" 
    print "#{"%3i" % percent}%" 
    print "[" 
    finished.downto(1) { |n| print "=" } 
    print ">" 
    not_finished.downto(1) { |n| print " " } 
    print "]" 
    end 
    print "\n" 
end 

ouput:

Executing gather for: ruby 
Going to public ftp - ftp.ruby-lang.org 
File list for /pub/ruby/2.0/: 
ruby-2.0.0-p647.tar.gz 

Downloading: ruby-2.0.0-p647.tar.gz 
100%[==============================>] 

La clave de este ejemplo es la letra "\ r "para reescribir la línea.