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

时间:2014-08-12 16:49:29

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

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

3 个答案:

答案 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)

处理Errno :: ENOENT异常

由于您的示例代码中不保证 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