【发布时间】:2010-12-20 03:42:37
【问题描述】:
有谁知道在下载文件时从 ruby 的 Net::FTP 库获取状态更新的方法?我正在尝试实现一个 Web 界面,在从远程 ftp 服务器下载文件时显示剩余百分比的进度条。
【问题讨论】:
有谁知道在下载文件时从 ruby 的 Net::FTP 库获取状态更新的方法?我正在尝试实现一个 Web 界面,在从远程 ftp 服务器下载文件时显示剩余百分比的进度条。
【问题讨论】:
供将来参考 - 我偶然发现了一个解决方案:
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
【讨论】:
我扩展了@smnirven 和@theoretick 给出的答案,创建了一个固定大小的进度条,在完成时会填满,这样您就可以直观地了解进度的完成程度:
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”,以便重写该行。
【讨论】:
我以 @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!
【讨论】:
只是对代码进行了小幅更新,以使输出更清晰。
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
【讨论】: