ruby 重新打开File对象上的流

f87krz0w  于 2023-04-05  发布在  Ruby
关注(0)|答案(3)|浏览(138)

假设你关闭了一个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 { ... }
hgc7kmma

hgc7kmma1#

IO#close documentation说道:
关闭→零
关闭ios并刷新任何挂起的对操作系统的写操作。流不可用于任何进一步的数据操作;如果进行这样的尝试,则引发IOError。
这意味着您无法再次重新打开同一流,因为此时它可能也已关闭了底层文件描述符。
reopen给你的是,你可以让这个对象指向另一个流/文件。如果你的IO对象绑定到一个常量,但你需要关闭文件并重新打开另一个,这可能很有用。

dxxyhpgq

dxxyhpgq2#

File超类IO提供了IO#rewind。这适用于文件等持久化资源,但不适用于真正的流,如管道、ttys和套接字。

nnvyjq4y

nnvyjq4y3#

这就是积木的作用!

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

相关问题