37

Rubyを使用する場合Tempfileは、スレッドセーフでプロセス間セーフな名前のファイルを作成します。そのようにファイル名だけが必要です。

次の方法よりも簡単なアプローチ方法があるかどうか疑問に思っていました。

t = Tempfile.new(['fleischwurst', '.png'])
temp_path = t.path
t.close
t.unlink
4

4 に答える 4

62

Dir :: Tmpname.create

を使用できます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し、末尾に増分値を追加して新しい名前を生成できるようにするためのコード用にあります。

Railsソリューション

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(Ruby 2.5.0以前)

Dir :: Tmpname.make_tmpnameは、Ruby2.5.0で削除されました。Ruby 2.4.4より前では、プレフィックスとしてディレクトリパスを受け入れることができましたが、Ruby 2.4.4では、ディレクトリセパレータが削除されています。

掘り下げると、が含まれtempfile.rbていることに気付くでしょう。中には、あなたが求めていることを実行するものがあります。TempfileDir::Tmpnamemake_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"
于 2012-12-09T13:35:52.440 に答える
1

ファイル名だけが必要なので、そのためにSecureRandomを使用するのはどうですか:

require 'securerandom'

filename =  "#{SecureRandom.hex(6)}.png" #=> "0f04dd94addf.png"

使用することもできますSecureRandom.alphanumeric

于 2018-07-16T23:00:18.290 に答える