Lesen Sie den Inhalt einer lokalen Datei in eine Variable in Rails


85

Ich möchte nur den gesamten Inhalt aus einer lokalen Datei abrufen und in einer Variablen speichern. Wie?

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

gibt mir nur einen Teil davon. In PHP habe ich gerade verwendet file_get_contents.


1
Ich halte dies für ein einzigartiges Windows-Problem, da diese und die von zed_0xff vorgeschlagene Lösung unter Mac / Linux einwandfrei funktionieren. Ich weiß, dass irb bei File.read \ r \ n zu \ n wird ... vielleicht ist das hier relevant?
Steven

Antworten:


162
data = File.read("/path/to/file")

1
Ich dachte das, aber das gibt mir eine Zeichenfolge der Länge 52. Die tatsächliche Dateigröße, wenn ich File.size ("/ path / to / file") gehe, ist 1676.
Steven

4
Lässt das die Datei nicht offen?
Tom Rossi

Ich mag diesen! Es wäre schön zu wissen, wie man die Header vom Dateiinhaltstyp fernhält
Tom Roggero

Dies ist nützlich, um ohne Verwendung eines Blocks zu lesen, sodass Inhalte einfach analysiert und auf Variablen gesetzt werden können, die anderen Blöcken zur Verfügung stehen, ohne dass eine Klasse erstellt werden muss.
Andrew

3
Um die Frage von @ TomRossi zu beantworten - nein, die Datei bleibt nicht offen. Wenn Sie read für die File-Klasse aufrufen, wird die Datei geöffnet, gelesen und geschlossen. Wenn Sie jedoch read für eine Dateiinstanz aufrufen (die zuerst geöffnet werden musste), wird sie nicht geschlossen. Die hier aufgerufene Methode ist ruby-doc.org/core-2.5.0/IO.html#method-c-read im Gegensatz zu ruby-doc.org/core-2.5.0/IO.html#method-i- Lesen Sie
AndrewKS

18

Ich denke, Sie sollten in Betracht ziehen, IO.binread("/path/to/file")wenn Sie einen aktuellen Ruby-Interpreter haben (dh> = 1.9.2).

Die IOKlassendokumentation finden Sie hier http://www.ruby-doc.org/core-2.1.2/IO.html


2
Dies ist kürzer und schließt die Datei für Sie.
Rob

16

Die Beantwortung meiner eigenen Frage hier ... stellt sich heraus, dass es sich nur um eine Windows-Eigenart handelt, die beim Lesen von Binärdateien (in meinem Fall einem JPEG) auftritt und ein zusätzliches Flag im Funktionsaufruf open oder File.open erfordert. Ich habe es überarbeitet open("/path/to/file", 'rb') {|io| a = a + io.read}und alles war in Ordnung.


10
Wenn Sie nicht tatsächlich eine Reihe von Dateien miteinander verketten, würde ich das einfach so schreiben:data = File.open("file", "rb") {|io| io.read}
Glenn Jackman

Sie, Sir, verdienen eine Medaille. Ich habe Stunden verloren, um herauszufinden, warum meine PDF-Anhänge beim Senden von einem Windows-Server nicht lesbar waren, bis ich auf diese Antwort gestoßen bin.
Augusto Samamé Barrientos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.