Rubyを使用する場合Tempfile
は、スレッドセーフでプロセス間セーフな名前のファイルを作成します。そのようにファイル名だけが必要です。
次の方法よりも簡単なアプローチ方法があるかどうか疑問に思っていました。
t = Tempfile.new(['fleischwurst', '.png'])
temp_path = t.path
t.close
t.unlink
Rubyを使用する場合Tempfile
は、スレッドセーフでプロセス間セーフな名前のファイルを作成します。そのようにファイル名だけが必要です。
次の方法よりも簡単なアプローチ方法があるかどうか疑問に思っていました。
t = Tempfile.new(['fleischwurst', '.png'])
temp_path = t.path
t.close
t.unlink
を使用できますDir::Tmpname.create
。使用する一時ディレクトリを特定します(ディレクトリを渡さない限り)。ブロックを期待していることを考えると、使用するのは少し醜いです:
require 'tmpdir'
# => true
Dir::Tmpname.create(['prefix-', '.ext']) {}
# => "/tmp/prefix-20190827-1-87n9iu.ext"
Dir::Tmpname.create(['prefix-', '.ext'], '/my/custom/directory') {}
# => "/my/custom/directory/prefix-20190827-1-11x2u0h.ext"
このブロックは、ファイルが存在するかどうかをテストErrno::EEXIST
し、末尾に増分値を追加して新しい名前を生成できるようにするためのコード用にあります。
Ruby on Railsによって実装されたソリューションは短く、Rubyで最初に実装されたソリューションに似ています。
require 'tmpdir'
# => true
File.join(Dir.tmpdir, "YOUR_PREFIX-#{Time.now.strftime("%Y%m%d")}-#{$$}-#{rand(0x100000000).to_s(36)}-YOUR_SUFFIX")
=> "/tmp/YOUR_PREFIX-20190827-1-wyouwg-YOUR_SUFFIX"
File.join(Dir.tmpdir, "YOUR_PREFIX-#{Time.now.strftime("%Y%m%d")}-#{$$}-#{rand(0x100000000).to_s(36)}-YOUR_SUFFIX")
=> "/tmp/YOUR_PREFIX-20190827-1-140far-YOUR_SUFFIX"
Dir :: Tmpname.make_tmpnameは、Ruby2.5.0で削除されました。Ruby 2.4.4より前では、プレフィックスとしてディレクトリパスを受け入れることができましたが、Ruby 2.4.4では、ディレクトリセパレータが削除されています。
掘り下げると、が含まれtempfile.rb
ていることに気付くでしょう。中には、あなたが求めていることを実行するものがあります。Tempfile
Dir::Tmpname
make_tmpname
require 'tmpdir'
# => true
File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname("prefix-", nil))
# => "/tmp/prefix-20190827-1-dfhvld"
File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname(["prefix-", ".ext"], nil))
# => "/tmp/prefix-20190827-1-19zjck1.ext"
File.join(Dir.tmpdir, Dir::Tmpname.make_tmpname(["prefix-", ".ext"], "suffix"))
# => "/tmp/prefix-20190827-1-f5ipo7-suffix.ext"
ファイル名だけが必要なので、そのためにSecureRandomを使用するのはどうですか:
require 'securerandom'
filename = "#{SecureRandom.hex(6)}.png" #=> "0f04dd94addf.png"
使用することもできますSecureRandom.alphanumeric