如何在Ruby中关闭和删除文件?

如何在Ruby中关闭和删除文件?,ruby,file,Ruby,File,假设我用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已经关闭,文件.e

假设我用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已经关闭,
文件.exist?(f)
将失败。那么,避免关闭和删除引发异常的文件的正确方法是什么


注意:我知道将块传递给File.open将直接关闭文件,但是,我正在寻找关闭和删除的一般方法。

为什么不在关闭后删除文件,而不依赖对象而是文件名本身

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
处理Errno::enoint异常 由于示例代码中不保证存在diagram.txt文件,因此更大的问题是处理Errno::enoint异常。如果试图打开或删除丢失的文件,可以调用自动关闭块,然后使用rescue处理异常。例如:

开始
File.open('diagram.txt','r')do | f|
#用文件做些什么
文件。删除(f)
结束
营救错误号::enoint
结束

根据您的具体情况,可以使用。发件人:

如果给定一个块,那么将构造一个文件对象,并以该对象作为参数调用该块块终止后,文件对象将自动关闭,临时文件将被删除。调用将返回块的值

(强调矿山)

用法:

require 'tempfile'

Tempfile.create('diagram.txt') do |f|
  # Do something with the file
end

如果您将一个块传递给File.open,它将自动关闭块末尾的文件。@konsolebox那么您可能会得到Errno::EACCES(至少在Linux上是这样),但这是一个单独的问题,超出了OP最初问题的范围。根据需要调整您的救援,或者打开一个新问题。我的实际意思是,如果文件不可读,但OP仍需要删除该文件,则不会删除该文件,因为将抛出每个访问。file.exists?是否已弃用?是否可以使用File.exist?