2009-11-25 22 views
10

Qualcuno sa di come ottenere un aggiornamento di stato dalla libreria Net :: FTP di Ruby durante il download di un file? Sto cercando di implementare un'interfaccia web che mostra una barra di avanzamento per la percentuale rimanente durante il download di un file da un server FTP remoto.Ruby Net :: Barra di avanzamento FTP

risposta

34

Per riferimento futuro - mi sono imbattuto su una soluzione:

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

Questa è una discussione precedente, ma è possibile assegnarsi la risposta. Buon lavoro. –

+0

Sono d'accordo, grazie per questo esempio – chrisan

0

ho costruito su di @ smnirven eccellente approccio per un po 'il progresso meno rumoroso con 100-dot progressione:

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 

uscita:

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

Ho ampliato le risposte fornite da @smnirven e @theoretick per creare un si fisso barra di avanzamento ze che si riempie come si completa in modo che si può avere un'idea visiva di come completare il progresso è:

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 chiave con questo esempio è la stampa "\ r "per riscrivere la linea.