当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Tempfile类用法及代码示例


本文简要介绍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-lang.org大神的英文原创作品 Tempfile类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。