假设你关闭了一个 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 { ... }
IO#close
的文档如下:
close → nil
关闭ios并刷新任何挂起的写操作到操作系统。该流不再可用于任何进一步的数据操作;如果尝试这样做,则会引发IOError。
这意味着您不能再次打开相同的流,因为此时它可能已经关闭了底层文件描述符。
reopen
提供的是,您可以使此对象指向另一个流/文件。如果您的IO对象绑定到常量,但需要关闭文件并重新打开另一个文件,则可能很有用。
reopen
。 - webdesserts这就是块的用途!
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
File
超类 IO
提供了 IO#rewind
。这对于像文件这样的持久资源有效,但对于真正的流(例如管道、tty 和套接字)无效。
#rewind
而不是#close
。如果您将其关闭,则已完成。 - dbenhur
f.reopen
但它不是我要找的东西。 - webdesserts