【问题标题】:How to close and delete a file in Ruby?如何在 Ruby 中关闭和删除文件?
【发布时间】:2014-08-12 16:49:28
【问题描述】:

假设我像这样在 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 将直接关闭文件,但是,我正在寻找关闭和删除的一般方法。

【问题讨论】:

  • 如果你将一个块传递给 File.open,它会在块的末尾自动关闭文件。

标签: ruby file


【解决方案1】:

处理 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

【讨论】:

  • @konsolebox 然后你可能会得到 Errno::EACCES (至少在 Linux 上),但这是 OP 原始问题范围之外的一个单独问题。根据需要调整您的救援,或提出一个新问题。
  • 我的意思是如果文件不可读,但 OP 仍然需要删除文件,文件不会被删除,因为会抛出 EACCESS。
【解决方案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

【讨论】:

  • 文件存在吗?已弃用,您可以使用 File.exist?
【解决方案3】:

根据您的具体情况,可能可以使用Tempfile.create。来自the docs

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

(强调我的)

用法:

require 'tempfile'

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2012-06-02
    • 2019-03-23
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多