重新打开File对象上的流

4

假设你关闭了一个 Ruby File 对象

f = File.open('testfile')
f.close
f.each_byte { ... } #=> IOError: closed stream

我知道你可以通过f = File.open(f)重新打开流,但是否有一种方法可以通过对象的IO方法重新打开流?
例如:
f.close
f.open_again
f.each_byte { ... }

我看到了 f.reopen 但它不是我要找的东西。 - webdesserts
3个回答

5

IO#close的文档如下:

close → nil

关闭ios并刷新任何挂起的写操作到操作系统。该流不再可用于任何进一步的数据操作;如果尝试这样做,则会引发IOError。

这意味着您不能再次打开相同的流,因为此时它可能已经关闭了底层文件描述符。

reopen提供的是,您可以使此对象指向另一个流/文件。如果您的IO对象绑定到常量,但需要关闭文件并重新打开另一个文件,则可能很有用。


谢谢,你讲解得非常清楚。我会看看能否在我的项目中利用reopen - webdesserts

0

这就是块的用途!

def to_file(&block)
  File.open('/tmp/output_path/to/file', 'w+b') do |file|
    file << 'generate your file content here'
    yield(file) if block_given?
  end
end

现在你可以传递一个块到 #to_file 方法中,在文件关闭之前对其进行操作。
FileGenerator.new.to_file do |file|
  # Attach me to an object or whatever you wish!
  # `file` is not closed inside of the block!
end

0

File 超类 IO 提供了 IO#rewind。这对于像文件这样的持久资源有效,但对于真正的流(例如管道、tty 和套接字)无效。


我尝试在关闭后使用它,但它给了我一个“IOError: closed stream”。 - webdesserts
@mcmullins 当您想要再次读取流时,请使用#rewind而不是#close。如果您将其关闭,则已完成。 - dbenhur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接