Зчитування вмісту локального файлу у змінну в 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

Мені подобається цей! Було б непогано знати, як захистити заголовки від типу вмісту файлу
— Tom Roggero

Це корисно для читання без використання блоку, що дозволяє легко аналізувати вміст і встановлювати змінні, доступні для інших блоків, без необхідності створення класу.
— Ендрю

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

18

Я думаю, вам слід розглянути можливість використання, IO.binread("/path/to/file")якщо у вас є недавній перекладач рубіну (тобто> = 1.9.2)

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


2
Це коротше і закриває файл для вас.
— Роб

16

Відповідаючи на моє власне запитання тут ... виявляється, це лише химерність Windows, яка трапляється під час читання двійкових файлів (у моєму випадку JPEG), що вимагає додаткового прапора у виклику відкритої функції або 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, поки я не натрапив на цю відповідь.
— Augusto Samamé Barrientos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.