当使用Tempfile时,Ruby正在创建一个具有线程安全和进程间安全名称的文件.我只需要这样的文件名.

我想知道是否有比以下更直接的方法:

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

推荐答案

目录:Tmpname.创造

你可以用目录:Tmpname.创造美元.它会计算出要使用的临时目录(除非您向其传递一个目录).考虑到它需要一个块,使用起来有点难看:

require 'tmpdir'
# => true
目录:Tmpname.创造(['prefix-', '.ext']) {}
# => "/tmp/prefix-20190827-1-87n9iu.ext"
目录:Tmpname.创造(['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"

目录:Tmpname.make_tmpname(Ruby 2.5.0及更早版本)

目录: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"

Ruby相关问答推荐

使用 RSpec 测试嵌套哈希时随机排序数组的匹配

RSpec:为什么 `instance_double` 可以与 StandardError 一起使用,但不能与其他异常类一起使用?

如何返回此 OOP Ruby 代码最后一行中的变量?

从 ruby​​ 脚本运行另一个 ruby​​ 脚本

使用 RSpec 存根 Time.now

Ruby 中的 Monad 类似功能

如何关闭 Rails 3.1 上的自动样式表/javascript 生成?

用于 ruby​​ gems 的新 10.9 OSX 的命令行工具?

如何在 Ruby 中生成子进程?

如何获取从位置 N 到 Ruby 中最后一个字符的子字符串?

从命令行使用Bundle 器将 gem 添加到 gemfile

Ruby 将 CSV 文件读取为 UTF-8 和/或将 ASCII-8Bit 编码转换为 UTF-8

从Ruby中的子类方法调用父类中的方法

为什么表达式 (true == true == true) 会产生语法错误?

Ruby - 用另一个字符串替换第一次出现的子字符串

将哈希传递给函数 ( *args ) 及其含义

如何从字符串创建 Ruby 日期对象?

如何在 Ruby 中将时间四舍五入到最接近的 15 分钟?

如何在 Ruby 中实现回调?

查找模块中可用的类