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, короткое и похоже на решение, изначально реализованное в Рубин:
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 был удален в Ruby 2.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"
person
Jan
schedule
09.12.2012