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.

Steven
quelle
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")
zed_0xff
quelle
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

Mehdi
quelle
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.

Steven
quelle
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