3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rails Dir.tmpdir 一時的なディレクトリを作成する

Last updated at Posted at 2021-04-26

この記事について

Dir.tmpdirを使用して一時的なディレクトリを作成する方法を書いた記事。
https://docs.ruby-lang.org/ja/latest/method/Dir/s/mktmpdir.html

どんな時に必要なの?

1度限りの画像を生成したくてtmp/hoge.pngと決め打ちすると、複数セッションだと同じ画像が共有されてしまう可能性がある。そんな時にユーザー別にディレクトリを用意してやって共有できないようにしてやる。そこでDir.tmpdirを使う!

他にも単純に「一時的に欲しい」という時に使えれば便利かも。

作成方法その① ブロックを与える

ブロックの評価が終わると作成された一時ディレクトリやその配下にあったファイルをFileUtils.#remove_entryで勝手に削除してくれる。

require 'tmpdir'

Dir.mktmpdir do |dir|
  puts dir
  #=> /var/folders/11/rq5ty2dj3_v0gybj_pmpl2gr0000gn/T/d20210426-40593-1f65en                                         
end

puts dir
#=> NameError (undefined local variable or method `dir' for main:Object)
# ブロックを抜けると作成されたディレクトリ及びその以下のファイルは削除される。

でも、時には自分の好きなタイミングで一時ディレクトリを削除したいよね!!!

作成方法その② ブロックを与えずに生成(好きなタイミングで削除)

ブロックを与えずに作成するにはDir.mktmpdirを使用する。
明示的に削除するためにはFileUtils.remove_entry_secureを使用する。

require 'tmpdir'

tmp_dir = Dir.mktmpdir
puts tmp_dir
#=> /var/folders/11/rq5ty2dj3_v0gybj_pmpl2gr0000gn/T/d20210426-40593-r8sklf
# ブロックを与えない場合は、ディレクトリは存在する。

FileUtils.remove_entry_secure tmp_dir
# FileUtils.remove_entry_securで明示的に削除するまで、作成されたディレクトリは存在する

変わった使い方(決まった単語を入れたい時)

ディレクトリ名の先頭に決まった単語を入れたい場合

require 'tmpdir'

tmp_dir = Dir.mktmpdir("foo")

Dir.mktmpdir("foo") do |dir|
  puts dir
  # 出力例:一時ディレクトリ の名前の先頭に'foo' をつける。
  #=> /var/folders/11/rq5ty2dj3_v0gybj_pmpl2gr0000gn/T/foo20210426-40593-bujxit"
#                                                      ^^^
end

ディレクトリ名の先頭と末尾に決まった単語を入れたい場合

require 'tmpdir'

Dir.mktmpdir(["foo", "bar"]) do |dir|
  puts dir
  # 出力例: 一時ディレクトリの名前の先頭に'foo' 、最後に'bar'をつける。
  #=> /var/folders/11/rq5ty2dj3_v0gybj_pmpl2gr0000gn/T/foo20210426-40593-bujxitbar"
  #                                                    ^^^                     ^^^
end

ディレクトリ名の末尾に決まった単語を入れたい場合

require 'tmpdir'

Dir.mktmpdir([nil, "bar"]) do|dir|
  puts dir
  # 出力例: 一時ディレクトリの名前の先頭に'foo' 、最後に'bar'をつける。
  #=> /var/folders/11/rq5ty2dj3_v0gybj_pmpl2gr0000gn/T/20210426-40593-bujxitbar"
  #                                                                         ^^^
end

補足

入れたい単語を指定しない場合(nil)は、ディレクトリ名の先頭にdが付帯される。

/var/folders/11/rq5ty2dj3_v0gybj_pmpl2gr0000gn/T/d20210426-40593-1f65en 
#                              ^
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?