https://github.com/peleteiro/progressbar
gem install progressbar
gem 'progressbar', '~> 0.21.0'
% irb --simple-prompt -r progressbar >> pbar = ProgressBar.new("test", 100) => (ProgressBar: 0/100) >> 100.times {sleep(0.1); pbar.inc}; pbar.finish test: 100% |oooooooooooooooooooooooooooooooooooooooo| Time: 00:00:10 => nil >> pbar = ProgressBar.new("test", 100) => (ProgressBar: 0/100) >> (1..100).each{|x| sleep(0.1); pbar.set(x)}; pbar.finish test: 67% |oooooooooooooooooooooooooo | ETA: 00:00:03 >> ProgressBar.new("test", 100) do |pbar| >> 100.times { sleep(0.1); pbar.inc } >> end test: 100% |oooooooooooooooooooooooooooooooooooooooo| Time: 00:00:10
def download_apk!
require 'open-uri'
require 'digest'
require 'fileutils'
return false if is_dead_download_url?
return false if is_apk_downloaded?
tmp_file = Tempfile.new [package_name, ".apk"]
File.open(tmp_file, 'wb') do |file_to_save|
pbar = nil
open(download_url, "rb", :content_length_proc => lambda {|t|
if t && 0 < t
pbar = ProgressBar.new("...", t)
pbar.file_transfer_mode
end
},
:progress_proc => lambda {|s|
pbar.set s if pbar
}) { |file_to_download| file_to_save.write(file_to_download.read) }
end
apk_md5 = Digest::MD5.file(tmp_file).hexdigest
apk_path = File.join Settings.apks_dir, "#{package_name}.#{apk_md5}.apk"
FileUtils.mkdir_p Settings.apks_dir
FileUtils.mv tmp_file, apk_path
package_info = dump_package_info apk_path
update_attributes package_info.merge(md5: apk_md5)
apk_path
rescue OpenURI::HTTPError, OpenURI::HTTPRedirect
false
end
http://www.ruby-doc.org/stdlib-1.9.3/libdoc/tempfile/rdoc/Tempfile.html
Tempfile
默认存储路径是 /tmp
A utility class for managing temporary files. When you create a Tempfile object, it will create a temporary file with a unique filename. A Tempfile objects behaves just like a File object, and you can perform all the usual file operations on it: reading data, writing data, changing its permissions, etc. So although this class does not explicitly document all instance methods supported by File, you can in fact call any File instance method on a Tempfile object.
require 'tempfile' file = Tempfile.new('foo') file.path # => A unique filename in the OS's temp directory, # e.g.: "/tmp/foo.24722.0" # This filename contains 'foo' in its basename. file.write("hello world") file.rewind file.read # => "hello world" file.close file.unlink # deletes the temp file