2013-11-15 27 views
1

有沒有辦法指定一個路徑作爲open()方法的臨時目錄(同時使用open-uri)?在Ubuntu中爲open()方法指定一個非標準的臨時目錄

我正在使用Ubuntu 12.04和Ruby 2.0.0與RVM - 它使用標準系統臨時目錄(/tmp)。在我下載大文件時,需要一段時間才能將文件從網絡中取出並移動到目標目錄中;另外,我不想填寫/tmp文件系統。

我知道還有其他的下載文件的方法,一些允許以塊的形式寫入數據,我只是問關於open-uri的標準open方法。

我使用的代碼是:

['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 

(這一切的一點是,我做一個腳本拉大文件進行任意站點的飽和,以檢查網絡鏈接的方式吞吐量)。

回答

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> 

PS我使用Ruby 2.1.0預覽,所以也許你不得不看#{ruby directory}/lib/ruby/2.0.0/open-uri.rb源,以瞭解如何OpenURI管理臨時文件(但它應該是非常相似)

+0

這就是很奇怪,但我已經嘗試將'ENV ['TMPDIR']'和目標目錄設置爲相同的值(這樣我就可以確保所有文件在退出或陷入'SIGINT'時被刪除),並且不起作用,在檢查'ENV's(在一個單獨的會話中)'TMPDIR'什麼都沒有,所以我認爲它顯然不是這樣。現在我在家中使用的是同一臺操作系統和同一臺筆記本電腦上的紅寶石,並且工作完美。我正在設計的機器的設置很可能有問題。謝謝;) –

+0

奇怪: - $不客氣;-) – mdesantis

+0

爲什麼我不能只傳遞一個字符串?當我使用上面的示例代碼時,它可以正常工作,但是當我執行以下操作時沒有問題: 'ENV [「TMPDIR」] =「/ whatever/path」' 'p open(「http://www.google.com」) ' – Florian

0

問題不明確你問關於File類的open方法嗎? 如果是這樣只需指定目錄

File.open("/your/path/to/new-tmp/#{uri.split(/\//)[-1]}","wb") 

開放URI的open方法只是讀出到StringIO使用open(uri,&:read)返回String沒有被存儲在臨時的其中之一。

require 'open-uri' 
open("http://www.google.com/").class 
#=> StringIO 
open("http://www.google.com/", &:read).class 
#=> String 
+0

OO在這裏返回'Tempfile':' ruby -ropen-uri -e'p打開(「http://www.google.com」).class'#=> Tempfile' – mdesantis

+0

嗯..你是對的,看來Buffer實際上是在創建這個TempFile – engineersmnky

相關問題