2013-11-15 2 views
1

Есть ли способ указать путь для использования в качестве временного каталога для метода open() (при использовании open-uri)?Укажите нестандартный временный каталог для метода open() в Ubuntu

Я использую Ubuntu 12.04 и Ruby 2.0.0 с RVM - он использует стандартный системный темп (/tmp). Когда я загружаю большие файлы, требуется некоторое время, прежде чем файл будет удален из сети и перенесен в целевой каталог; Кроме того, я не хочу заполнять файловую систему /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 

(точка все это я должен сделать скрипт вытягивать большие файлы из произвольных сайтов как способ насытить сетевое соединение для того, чтобы проверить пропускная способность).

ответ

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 Я использую рубин 2.1.0 предварительный просмотр, поэтому, возможно, вы должны смотреть на #{ruby directory}/lib/ruby/2.0.0/open-uri.rb источник для того, чтобы понять, как OpenURI управляет временный файл (но он должен быть очень похож)

+0

То есть довольно странно, но я уже пытался установить «ENV ['TMPDIR»] и целевой каталог на одно и то же значение (чтобы я мог убедиться, что все файлы удалены при выходе или в ловушке 'SIGINT'), и это не сработало, также при проверке 'ENV' (в отдельном сеансе) ничего не было в 'TMPDIR', поэтому я думал, что это, по-видимому, не так.Теперь я использую ту же ОС и тот же Ruby на ноутбуке дома, и он отлично работает. Скорее всего, что-то не так с настройкой машины, над которой я работал. Спасибо;) –

+0

Странно: - $ приветствую ;-) – mdesantis

+0

Почему я не могу просто передать строку? Он отлично работает, когда я использую приведенный выше пример кода, но не тогда, когда я делаю следующее: 'ENV [" TMPDIR "] ="/whatever/path "' 'p open (" http://www.google.com ") ' – Florian

0

вопрос неясный вы спрашиваете о методе openFile класс? Если это так просто указать каталог

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

Метод открытого open только URI считывает в 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 open ("http://www.google.com") .class' # => Tempfile' – mdesantis

+0

Хм .. Вы правы, и кажется, что Buffer на самом деле создает этот TempFile – engineersmnky

Смежные вопросы