What is the best way to get an empty temporary directory in Ruby on Rails?

后端 未结 9 556

What is the best way to get a temporary directory with nothing in it using Ruby on Rails? I need the API to be cross-platform compatible. The stdlib tmpdir won\'t work.

相关标签:
9条回答
  • 2020-12-28 13:28

    A general aprox I'm using now:

    def in_tmpdir
      path = File.expand_path "#{Dir.tmpdir}/#{Time.now.to_i}#{rand(1000)}/"
      FileUtils.mkdir_p path
      yield path
    ensure
      FileUtils.rm_rf( path ) if File.exists?( path )
    end
    

    So in your code you can:

    in_tmpdir do |tmpdir|
      puts "My tmp dir: #{tmpdir}"
      # work with files in the dir
    end
    

    The temporary dir will be removed automatically when your method will finish.

    0 讨论(0)
  • You can use Dir.mktmpdir.

    Using a block will get rid of the temporary directory when it closes.

    Dir.mktmpdir do |dir|
      File.open("#{dir}/foo", 'w') { |f| f.write('foo') }
    end
    

    Or if you need multiple temp directories to exist at the same time, for example

    context 'when there are duplicate tasks' do
      it 'raises an DuplicateTask error' do
        begin
          tmp_dir1 = Dir.mktmpdir('foo')
          tmp_dir2 = Dir.mktmpdir('bar')
    
          File.new("#{tmp_dir1}/task_name", 'w+')
          File.new("#{tmp_dir2}/task_name", 'w+')
    
          expect { subject.filepath('task_name') }.to raise_error(TaskFinder::DuplicateTask)
        ensure
          FileUtils.remove_entry tmp_dir1
          FileUtils.remove_entry tmp_dir2
        end
      end
    end
    

    Dir.mktmpdir creates a temporary directory under Dir.tmpdir (you'll need to require 'tmpdir' to see what that evaluates to).

    If you want to use your own path, Dir.mktmpdir takes an optional second argument tmpdir if non-nil value is given. E.g.

    Dir.mktmpdir(nil, "/var/tmp") { |dir| "dir is '/var/tmp/d...'" }
    
    0 讨论(0)
  • 2020-12-28 13:31

    The Dir object has a method mktmpdir which creates a temporary directory:

    require 'tmpdir' # Not needed if you are using rails.
    
    Dir.mktmpdir do |dir|
      puts "My new temp dir: #{dir}"
    end
    

    The temporary directory will be removed after execution of the block.

    0 讨论(0)
提交回复
热议问题