Legge il contenuto di un file locale in una variabile in Rails


87

Tutto quello che voglio fare è ottenere tutto il contenuto da un file locale e memorizzarlo in una variabile. Come?

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

me ne dà solo una parte. In PHP, ho appena usato file_get_contents.


1
Ritengo che questo sia un problema unicamente di Windows, perché questa soluzione, e quella proposta da zed_0xff, funzionano perfettamente su Mac / Linux. So che irb si trasforma \ r \ n in \ n quando si esegue File.read ... forse è rilevante qui?
Steven

Risposte:


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

1
Lo pensavo, ma questo mi dà una stringa di lunghezza 52. La dimensione effettiva del file quando vado a File.size ("/ path / to / file") è 1676.
Steven

4
Questo non lascia il file aperto?
Tom Rossi

Mi piace questo! Sarebbe bello sapere come mantenere le intestazioni dal tipo di contenuto del file
Tom Roggero

Ciò è utile per la lettura senza l'uso di un blocco, consentendo ai contenuti di essere facilmente analizzati e impostati su variabili disponibili per altri blocchi senza la necessità di creare una classe.
Andrew

3
Per rispondere alla domanda di @ TomRossi - no, questo non lascia il file aperto. La chiamata di lettura sulla classe File apre, legge e chiude il file. Tuttavia, la chiamata di lettura su un'istanza di file (che doveva essere aperta prima) non la chiude. Il metodo chiamato qui è ruby-doc.org/core-2.5.0/IO.html#method-c-read in contrapposizione a ruby-doc.org/core-2.5.0/IO.html#method-i- leggi
AndrewKS

18

Penso che dovresti prendere in considerazione l'utilizzo IO.binread("/path/to/file")se hai un interprete ruby ​​recente (cioè> = 1.9.2)

Puoi trovare la IOdocumentazione della classe qui http://www.ruby-doc.org/core-2.1.2/IO.html


2
Questo è più breve e chiude il file per te.
Rob il

16

Rispondendo alla mia domanda qui ... si scopre che è solo una stranezza di Windows che si verifica durante la lettura di file binari (nel mio caso un JPEG) che richiede un flag aggiuntivo nella chiamata alla funzione open o File.open. L'ho rivisto open("/path/to/file", 'rb') {|io| a = a + io.read}e tutto è andato bene.


10
A meno che tu non stia effettivamente concatenando un gruppo di file insieme, lo scriverei semplicemente come:data = File.open("file", "rb") {|io| io.read}
glenn jackman,

Signore, meriti una medaglia. Ho perso ore cercando di capire perché i miei allegati PDF erano illeggibili se inviati da un server Windows finché non sono incappato in questa risposta.
Augusto Samamé Barrientos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.