Автоматически открывать файл как бинарный с Ruby - PullRequest
16 голосов
/ 19 января 2012

Я использую Ruby 1.9, чтобы открыть несколько файлов и скопировать их в архив. Сейчас есть несколько бинарных файлов, но некоторые нет. Поскольку Ruby 1.9 не открывает двоичные файлы автоматически как двоичные файлы, есть ли способ открыть их автоматически? (Таким образом, «.class» будет двоичным, а «.txt» нет)

Ответы [ 3 ]

33 голосов
/ 02 августа 2012

На самом деле предыдущий ответ Алексея Д. неполон. Хотя в файловых системах 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'). Это важно, если вы хотите прочитать двоичные данные в строку и переместить их (например, сохранить их в базе данных и т. Д.).

12 голосов
/ 02 декабря 2015

Начиная с 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 голосов
/ 20 января 2012

На Unix-подобных платформах нет разницы между открытием файлов в «бинарном» и «текстовом» режимах.В Windows «текстовый» режим преобразует разрывы строк в стиль DOS, а «двоичный» - нет.

Если вам не требуется преобразование разрывов строк на платформах Windows, просто откройте все файлы в «двоичном» режиме.Нет никакого вреда при чтении текстового файла в «двоичном» режиме.

Если вы действительно хотите различать, вам придется сопоставить File.extname (имя файла) со списком известных расширений, таких как «.txt»и ".class".

...