Автоматически открывать файл как двоичный с Ruby
Я использую Ruby 1.9, чтобы открыть несколько файлов и скопировать их в архив. Теперь есть несколько двоичных файлов, но некоторые нет. Поскольку Ruby 1.9 не открывает двоичные файлы автоматически как двоичные файлы, есть ли способ открыть их автоматически в любом случае? (Так что ".class" будет двоичным, ".txt" не)
Ответы
Ответ 1
Собственно, предыдущий ответ Alex D является неполным. Хотя верно, что в файловых системах Unix нет "текстового" режима, Ruby делает разницу между открытием файлов в двоичном и недвоичном режиме:
s = File.open('/tmp/test.jpg', 'r') { |io| io.read }
s.encoding
=> #<Encoding:UTF-8>
отличается от (обратите внимание на "rb"
)
s = File.open('/tmp/test.jpg', 'rb') { |io| io.read }
s.encoding
=> #<Encoding:ASCII-8BIT>
Последнее, как говорят docs, устанавливает внешнюю кодировку в ASCII-8BIT, которая сообщает Ruby не пытаться интерпретировать результат в UTF -8. Вы можете добиться того же, установив кодировку явно с помощью s.force_encoding('ASCII-8BIT')
. Это ключ, если вы хотите читать двоичные файлы в строке и перемещать их (например, сохранять их в базу данных и т.д.).
Ответ 2
Так как Ruby 1.9.1 существует отдельный метод двоичного чтения (IO.binread
), а с 1.9.3 есть один для (IO.binwrite
):
Для чтения:
content = IO.binread(file)
Для записи:
IO.binwrite(file, content)
Так как IO
является родительским классом File
, вы также можете сделать следующее, что, вероятно, более выразительно:
content = File.binread(file)
File.binwrite(file, content)
Ответ 3
На Unix-подобных платформах нет разницы между открытием файлов в режимах "двоичный" и "текстовый". В Windows режим "текст" преобразует разрывы строк в стиль DOS, а "двоичный" режим не работает.
Если вам не нужна конверсия строк на платформах Windows, просто откройте все файлы в "двоичном" режиме. Нет никакого вреда при чтении текстового файла в "двоичном" режиме.
Если вы действительно хотите отличить, вам нужно будет сопоставить File.extname(имя файла) со списком известных расширений, таких как ".txt" и ".class".