2009-11-25 92 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「以重寫該行。