如何关闭作为参数传入的临时(匿名)File对象?

时间:2012-06-06 16:50:20

标签: ruby file-io

有时我发现自己需要打开文件,读取内容并进行一些功能操作并将数据存储到变量中。这将最终得到以下代码:

@some_vars = File.open("items.txt").read.chomp!.split(',')

我在这里有两个问题:

  • 此行之后文件实例File.open()是否已关闭?
  • 如何在不牺牲可读性的情况下关闭这样的File实例?

3 个答案:

答案 0 :(得分:4)

不,File.open使文件句柄保持打开状态。你应该使用IO.read代替它,它返回文件的全部内容并在完成后关闭它:

IO.read("items.txt").chomp!.split(',')

对于单行而言,这比将块传递给File.open要短一些。

答案 1 :(得分:1)

您发布的示例不会自动关闭文件描述符。您必须在描述符上手动调用File#close,或者让Ruby在解释器退出时自动关闭文件。

如果您想自动关闭文件,则需要File#open block syntax

File.open('items.txt') { |f| f.read.chomp!.split(',') }

Ruby会在块终止时关闭文件。

答案 2 :(得分:0)

即使在File.open中使用块,也无法确保文件始终处于关闭状态,例如,应用程序暂停时。 有一种技巧可以防止这种情况发生。

f = File.open('items.txt', 'w')

at_exit { f.flush; f.close }

然后at_exit块将在应用程序结束时或程序退出时执行。