2009-11-25 55 views
10

有谁知道在下载文件时从ruby的Net :: FTP库获取状态更新的方法吗?我试图实现一个Web界面,该界面显示从远程FTP服务器下载文件时剩余百分比的进度条。Ruby Net :: FTP进度条

回答

34

以供将来参考 - 我偶然发现了一个解决方案:

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

这是一个古老的线索,但是,你可以给自己一个答案。做得好。 – 2011-11-12 21:21:14

+0

我同意,谢谢你的这个例子 – chrisan 2012-12-09 12:40:16

0

我建@ smnirven的优秀做法对少了几分喧闹的进步与100点的进展:

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 

输出:

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

我扩展了@smnirven和@theoretick给出的答案以创建一个固定的si

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 

输出继电器:

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%[==============================>] 

这个例子的关键是打印“\到处乱飞,因为它完成,这样就可以有一个如何完成进度是视觉的想法泽进度条r“以重写该行。