在Ubuntu中为open()方法指定一个非标准的临时目录

时间:2013-11-15 14:36:18

标签: ruby ubuntu

有没有办法指定用作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

(所有这一切的重点是我要制作一个脚本,将大型文件从任意站点中拉出来,以此作为使网络链路饱和以检查吞吐量的方法。)

2 个答案:

答案 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