假设我像这样在 Ruby 中打开一个文件:
f = File.open('diagram.txt', 'r')
Run Code Online (Sandbox Code Playgroud)
现在,为了关闭和删除该文件,我有以下代码:
begin
f = File.open('diagram.txt', 'r')
ensure
if !f.nil? && File.exist?(f)
f.close unless f.closed?
File.delete(f)
end
end
Run Code Online (Sandbox Code Playgroud)
我发现这段代码太复杂了,File.exist?(f)如果 f 已经关闭,它就会失败。那么,避免关闭和删除引发异常的文件的正确方法是什么?
注意:我知道将块传递给 File.open 会直接关闭文件,但是,我正在寻找关闭和删除的一般方法。
Tod*_*obs 14
由于您的diagram.txt文件不能保证存在于您的示例代码中,因此您更大的问题是处理Errno::ENOENT异常。您可以在自关闭块中调用File#open,然后在您尝试打开或删除丢失的文件时使用救援来处理异常。例如:
begin
File.open('diagram.txt', 'r') do |f|
# do something with file
File.delete(f)
end
rescue Errno::ENOENT
end
Run Code Online (Sandbox Code Playgroud)
为什么不在关闭后删除文件而不是依赖于对象而是依赖于文件名本身?
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
Run Code Online (Sandbox Code Playgroud)