この記事について
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
# ^