Автоматически открывать файл как двоичный с 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".