有没有办法指定用作open()
方法的临时目录的路径(使用open-uri
时)?
我正在使用Ubuntu 12.04和Ruby 2.0.0与RVM - 它使用标准系统临时目录(/tmp
)。当我下载大文件时,需要一段时间才能将文件从Web上移除并移动到目标目录中;另外,我不想填充/tmp
文件系统。
我知道还有其他下载文件的方法,有些允许以块的形式写入数据,我只是询问open
的标准open-uri
方法。
我使用的代码是:
['ftp://example1.com/a.gz', 'ftp://example2.com/b', 'example3.com/somefile'].
each do |uri|
thread = Thread.new do
3.times do
File.open(uri.split(/\//)[-1], "wb") do |file|
file.write open(uri).read
end
end
end
threads << thread
end
(所有这一切的重点是我要制作一个脚本,将大型文件从任意站点中拉出来,以此作为使网络链路饱和以检查吞吐量的方法。)
答案 0 :(得分:1)
查看OpenURI
源代码,我们可以看到它使用了Tempfile
:
[...]
io = Tempfile.new('open-uri')
[...]
Tempfile
为了选择临时目录使用Dir.tmpdir
,而TMPDIR
又使用系统临时目录或环境变量require 'open-uri'
require 'fileutils'
d = "#{Dir.home}/.tmp"
Dir.mkdir d
ENV["TMPDIR"] = d
p open("http://www.google.com")
ENV.delete("TMPDIR")
FileUtils.rm_rf d
指定的目录(在其他目录之间)。所以我们可以这样写:
$HOME/.tmp
在一个命令中(请确保ruby -ropen-uri -rfileutils -e 'd = "#{Dir.home}/.tmp"; Dir.mkdir d; ENV["TMPDIR"] = d; p open("http://www.google.com"); ENV.delete("TMPDIR"); FileUtils.rm_rf d'
不存在且未使用):
#<Tempfile:$HOME/.tmp/open-uri20131115-16887-nag9pr>
应打印类似
的内容#{ruby directory}/lib/ruby/2.0.0/open-uri.rb
PS 我正在使用Ruby 2.1.0预览版,因此您可能需要查看OpenURI
源代码才能了解{{1}}如何管理临时文件(但是它应该非常相似)
答案 1 :(得分:0)
问题尚不清楚您是否询问open
类的File
方法?
如果是这样,只需指定目录
File.open("/your/path/to/new-tmp/#{uri.split(/\//)[-1]}","wb")
open-uri的open
方法仅使用StringIO
读出open(uri,&:read)
,返回String
这些都不存储在temp中。
require 'open-uri'
open("http://www.google.com/").class
#=> StringIO
open("http://www.google.com/", &:read).class
#=> String