本文简要介绍ruby语言中 Tempfile类
的用法。
用于管理临时文件的实用程序类。当您创建 Tempfile
对象时,它将创建一个具有唯一文件名的临时文件。 Tempfile
对象的行为就像 File
对象一样,您可以对其执行所有常见的文件操作:读取数据、写入数据、更改其权限等。因此,尽管此类没有明确记录支持的所有实例方法通过 File
,您实际上可以在 Tempfile
对象上调用任何 File
实例方法。
概要
require 'tempfile'
file = Tempfile.new('foo')
file.path # => A unique filename in the OS's temp directory,
# e.g.: "/tmp/foo.24722.0"
# This filename contains 'foo' in its basename.
file.write("hello world")
file.rewind
file.read # => "hello world"
file.close
file.unlink # deletes the temp file
良好做法
显式关闭
当 Tempfile
对象被垃圾回收时,或者当 Ruby 解释器退出时,其关联的临时文件会被自动删除。这意味着没有必要在使用后显式删除 Tempfile
,尽管这样做是一个好习惯:不显式删除未使用的临时文件可能会在文件系统上留下大量临时文件,直到它们被垃圾收集。这些临时文件的存在会使确定新的 Tempfile
文件名变得更加困难。
因此,应始终调用 unlink
或在确保块中关闭,如下所示:
file = Tempfile.new('foo')
begin
# ...do something with file...
ensure
file.close
file.unlink # deletes the temp file
end
Tempfile.create
{ … } 就是为此目的而存在的,使用起来更方便。请注意, Tempfile.create
返回一个 File
实例而不是 Tempfile
,这也避免了委托的开销和复杂性。
Tempfile.open('foo') do |file|
# ...do something with file...
end
创建后取消链接
在 POSIX 系统上,可以在创建文件后和关闭文件之前立即取消链接。这会在不关闭文件句柄的情况下删除文件系统条目,因此它确保只有已经打开文件句柄的进程才能访问文件的内容。如果您不希望任何其他进程能够读取或写入 Tempfile
,并且您也不需要知道 Tempfile 的文件名,强烈建议您这样做。
例如,unlink-after-creation 的一个实际用例是这样的:您需要一个大字节缓冲区,该缓冲区太大而无法舒适地放入 RAM,例如当你在写一个 web 服务器并且你想缓冲客户端的文件上传数据时。
有关更多信息和代码示例,请参阅 unlink
。
小笔记
Tempfile 的文件名选择方法既是线程安全的,又是inter-process-safe:它保证没有其他线程或进程会选择相同的文件名。
然而, Tempfile
本身可能并不完全是线程安全的。如果您从多个线程访问相同的 Tempfile
对象,那么您应该使用互斥锁来保护它。
相关用法
- Ruby Tempfile.unlink用法及代码示例
- Ruby Tempfile.new用法及代码示例
- Ruby Tempfile.open用法及代码示例
- Ruby Tempfile.create用法及代码示例
- Ruby Template.match用法及代码示例
- Ruby Time tv_sec用法及代码示例
- Ruby Time usec用法及代码示例
- Ruby TCPServer.accept用法及代码示例
- Ruby Time yday()用法及代码示例
- Ruby Time succ()用法及代码示例
- Ruby Time mon()用法及代码示例
- Ruby Time.gmtime用法及代码示例
- Ruby Time iso8601用法及代码示例
- Ruby Time.at用法及代码示例
- Ruby Thread.kill用法及代码示例
- Ruby Time.utc_offset用法及代码示例
- Ruby Time.isdst用法及代码示例
- Ruby TracePoint.defined_class用法及代码示例
- Ruby Time.time + numeric用法及代码示例
- Ruby Thread.pending_interrupt?用法及代码示例
- Ruby Time wednesday?用法及代码示例
- Ruby Time.wednesday?用法及代码示例
- Ruby Thread kill()用法及代码示例
- Ruby Time asctime()用法及代码示例
- Ruby TypeError类用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Tempfile类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。