Прочитать содержимое локального файла в переменную в Rails

86

Все, что я хочу сделать, это получить весь контент из локального файла и сохранить его в переменной. Как?

File.read(@icon.full_filename).each {|l| r += l}

дает мне только его часть. В PHP я просто использовал file_get_contents.

Стивен
источник
1
Я считаю, что это уникальная проблема Windows, потому что это решение и решение, предложенное zed_0xff, отлично работают на Mac / Linux. Я знаю, что irb превращает \ r \ n в \ n при выполнении File.read ... возможно, это актуально здесь?
Стивен

Ответы:

163
data = File.read("/path/to/file")
zed_0xff
источник
1
Я так и думал, но это дает мне строку длиной 52. Фактический размер файла, когда я перехожу в File.size («/ путь / к / файлу»), равен 1676.
Стивен
4
Разве это не оставляет файл открытым?
Tom Rossi
Мне нравится этот! Было бы неплохо узнать, как уберечь заголовки от типа содержимого файла,
Том Роггеро
Это полезно для чтения без использования блока, что позволяет легко анализировать содержимое и устанавливать переменные, доступные для других блоков, без необходимости создания класса.
Эндрю
3
Чтобы ответить на вопрос @TomRossi - нет, это не оставляет файл открытым. Вызов чтения класса File открывает, читает и закрывает файл. Однако вызов read для экземпляра файла (который должен был быть открыт первым) не закрывает его. Здесь вызывается метод ruby-doc.org/core-2.5.0/IO.html#method-c-read в отличие от ruby-doc.org/core-2.5.0/IO.html#method-i- читать
AndrewKS 05
18

Я думаю, вам следует подумать об использовании, IO.binread("/path/to/file")если у вас есть недавний интерпретатор Ruby (например,> = 1.9.2)

Вы можете найти IOдокументацию по классу здесь http://www.ruby-doc.org/core-2.1.2/IO.html

Мехди
источник
2
Это короче и закрывает файл за вас.
Роб
16

Отвечая на мой собственный вопрос здесь ... оказывается, что это странность только Windows, которая возникает при чтении двоичных файлов (в моем случае JPEG), для которого требуется дополнительный флаг при вызове функции open или File.open. Я изменил его на, open("/path/to/file", 'rb') {|io| a = a + io.read}и все было хорошо.

Стивен
источник
10
Если вы на самом деле не объединяете кучу файлов вместе, я бы просто написал это как:data = File.open("file", "rb") {|io| io.read}
glenn jackman
Вы, сэр, заслужили медаль. Я потерял часы, пытаясь понять, почему мои вложения PDF были нечитаемыми при отправке с сервера Windows, пока я не наткнулся на этот ответ.
Аугусто Самаме Барриентос