Прочитать содержимое локального файла в переменную в 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")

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, пока я не наткнулся на этот ответ.
Аугусто Самаме Барриентос
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.