當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。