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