2009-11-25 40 views
10

Có ai biết cách cập nhật trạng thái từ thư viện Net :: FTP của Ruby trong khi tải xuống tệp không? Tôi đang cố gắng để thực hiện một giao diện web cho thấy một thanh tiến trình cho phần trăm còn lại khi tải xuống một tập tin từ một máy chủ FTP từ xa.Ruby Net :: Thanh tiến trình FTP

Trả lời

34

Để tham khảo trong tương lai - tôi stumbled khi một giải pháp:

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

Đây là một chủ đề cũ, nhưng, bạn có thể tự thưởng cho mình câu trả lời. Làm tốt lắm. –

+0

Tôi đồng ý, cảm ơn ví dụ này – chrisan

0

tôi xây dựng trên cách tiếp cận tuyệt vời @ smnirven cho một chút tiến bộ ít ồn ào với 100-dot tiến triển:

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 

đầu ra:

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

Tôi đã mở rộng câu trả lời được đưa ra bởi @smnirven và @theoretick để tạo một si cố định thanh tiến trình ze lấp đầy khi nó hoàn thành để bạn có thể có một ý tưởng trực quan về cách hoàn thành tiến độ là:

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

Chìa khóa với ví dụ này là print "\ r "để viết lại dòng.