12 votes

Barre de progression Ruby Net::FTP

Quelqu'un connaît-il un moyen d'obtenir une mise à jour du statut de la bibliothèque Net::FTP de Ruby pendant le téléchargement d'un fichier ? J'essaie d'implémenter une interface web qui affiche une barre de progression pour le pourcentage restant lors du téléchargement d'un fichier à partir d'un serveur ftp distant.

37voto

smnirven Points 700

Pour une référence future - je suis tombé sur une solution :

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

5voto

moss04 Points 51

J'ai développé les réponses données par @smnirven et @theoretick pour créer une barre de progression de taille fixe qui se remplit au fur et à mesure qu'elle se termine afin que vous puissiez avoir une idée visuelle de l'avancement de la progression :

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 clé dans cet exemple est l'impression " \r " afin de réécrire la ligne.

1voto

theoretick Points 11

Je me suis appuyé sur l'excellente approche de @smnirven pour une progression un peu moins bruyante avec une progression à 100 points :

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

sortie :

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

0voto

Gagan Gupta Points 881

Juste une petite mise à jour du code pour rendre la sortie un peu plus propre.

filesize = ftp.size(FILENAME)
transferred = 0
percent_finished = -9999

ftp.gettextfile(FILENAME, File.basename(FILENAME)) { |data|
  transferred += data.size

  temp = (((transferred).to_f/filesize.to_f)*100).round

  if percent_finished < temp
    percent_finished = temp
    STDOUT.write "\r Download progress: #{percent_finished.round}% completed"
  end
}
ftp.close

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X