假设我在Ruby中打开一个文件:
f = File.open('diagram.txt', 'r')
现在,为了关闭并删除该文件,我有以下代码:
begin
f = File.open('diagram.txt', 'r')
ensure
if !f.nil? && File.exist?(f)
f.close unless f.closed?
File.delete(f)
end
end
我发现这段代码过于复杂,如果f已经关闭,File.exist?(f)
会失败。那么,避免关闭和删除引发异常的文件的正确方法是什么?
注意:我知道将一个块传递给File.open将直接关闭文件,但是,我正在寻找关闭和删除的一般方法。
答案 0 :(得分:2)
为什么不在关闭后删除文件而不依赖于对象而是依赖于文件名本身?
begin
f = File.open('diagram.txt', 'r')
ensure
f.close unless f.nil? or f.closed?
File.delete('diagram.txt') if File.exists? 'diagram.txt'
end
答案 1 :(得分:2)
由于您的示例代码中不保证 diagram.txt 文件存在,因此更大的问题是处理 Errno :: ENOENT 异常。您可以在自动关闭块中调用File#open,然后在尝试打开或删除丢失的文件时使用rescue来处理异常。例如:
begin
File.open('diagram.txt', 'r') do |f|
# do something with file
File.delete(f)
end
rescue Errno::ENOENT
end
答案 2 :(得分:0)
根据您的具体情况,可能会使用Tempfile.create
。来自the docs:
如果给出了一个块,则将构造一个File对象,并以该对象作为参数调用该块。 文件对象将自动关闭,并在块终止后删除临时文件。该调用返回块的值。
(强调我的)
用法:
require 'tempfile'
Tempfile.create('diagram.txt') do |f|
# Do something with the file
end