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