0

我读取了一个文本文件以从中获取一些信息,然后我需要重命名该文件所在的目录。我无法这样做,因为该文件已被锁定。如果我注释掉从文件中读取的函数,或者如果我手动解锁文件(解锁实用程序)一切正常。

我在 ruby​​ 1.8.7 (2010-08-16 patchlevel 302) [i386-mingw32]

此行使文件保持打开状态File.open(file).readlines.each{|line|

这两行使文件保持打开状态

    my_file=File.open(file,"r")
    my_file.collect {|line|

除非我最后使用关闭文件my_file.close

IO.html#method-c-open 的核心 1.8.7 的man状态

如果给出了可选代码块,它将作为参数传递 io,当块终止时,IO 对象将自动关闭。

所以我不明白为什么文件仍然打开。

1.8.7 中读取文本文件并自动关闭它的单行代码是什么?

4

3 回答 3

5

文档很清楚。但是,您将块传递给collect. 而且由于您没有将其传递给open,因此您有责任关闭文件。

要自动关闭文件,请尝试以下操作:

File.open(file,"r") do |f|
  f.collect # or whatever
end
于 2012-06-14T23:39:20.080 回答
1

如果您希望块自动关闭文件而不将文件句柄传递给块,则可以使用 File 对象的 IO#readlines 方法。

array_of_lines = File.readlines('/tmp/foo')

这将读取文件的全部内容,然后关闭文件句柄。只要文件小到可以轻松放入内存,这是一个不错的选择。

于 2012-06-14T23:43:27.980 回答
1

尝试将块直接传递给“打开”调用:

File.open(file, 'r') do |f|
  f.each_line do |line|
    # Process each line
  end
end

或者,如果您只想一次性获取文件内容,请尝试以下操作:

lines = File.read(file).split(/\r?\n/)
于 2012-06-14T23:45:18.387 回答