Повторное открытие потока на объекте File
Скажем, вы закрыли рубин 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 { ... }
3 ответа
IO#close
Документация гласит:
закрыть → ноль
Закрывает IOS и сбрасывает все ожидающие записи в операционной системе. Поток недоступен для любых дальнейших операций с данными; IOError повышается, если такая попытка сделана.
Это означает, что вы не можете снова открыть тот же поток, так как он, вероятно, к тому времени уже закрыл основной файловый дескриптор.
Какие reopen
дает вам, это то, что вы можете заставить этот объект указывать на другой поток / файл. Может быть полезно, если ваш объект ввода-вывода связан с константой, но вам нужно закрыть файл и открыть другой.
File
суперкласс IO
предложения IO#rewind
, Это работает для постоянных ресурсов, таких как файлы, но не для настоящих потоков, таких как каналы, ttys и сокеты.
Вот для чего нужны блоки!
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