Повторное открытие потока на объекте 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
Другие вопросы по тегам