Leer el contenido de un archivo local en una variable en Rails

86

Todo lo que quiero hacer es obtener todo el contenido de un archivo local y almacenarlo en una variable. ¿Cómo?

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

solo me da una parte. En PHP, acabo de usar file_get_contents.

Steven
fuente
1
Siento que este es un problema exclusivo de Windows, porque esta solución y la propuesta por zed_0xff funcionan perfectamente bien en Mac / Linux. Sé que irb se convierte \ r \ n en \ n al hacer File.read ... ¿quizás eso sea relevante aquí?
Steven

Respuestas:

163
data = File.read("/path/to/file")
zed_0xff
fuente
1
Pensé eso, pero eso me da una cadena de longitud 52. El tamaño real del archivo cuando voy a File.size ("/ ruta / a / archivo") es 1676.
Steven
4
¿No deja el archivo abierto?
Tom Rossi
¡Me gusta este! Sería bueno saber cómo mantener los encabezados del tipo de contenido de archivo
Tom Roggero
Esto es útil para leer sin el uso de un bloque, lo que permite que el contenido se analice fácilmente y se establezca en variables disponibles para otros bloques sin la necesidad de crear una clase.
Andrew
3
Para abordar la pregunta de @ TomRossi, no, esto no deja el archivo abierto. Llamar a read en la clase File abre, lee y cierra el archivo. Sin embargo, llamar a read en una instancia de archivo (que tenía que abrirse primero) no lo cierra. El método que se llama aquí es ruby-doc.org/core-2.5.0/IO.html#method-c-read en lugar de ruby-doc.org/core-2.5.0/IO.html#method-i- leer
AndrewKS
18

Creo que debería considerar usarlo IO.binread("/path/to/file")si tiene un intérprete de ruby ​​reciente (es decir,> = 1.9.2)

Puede encontrar IOla documentación de la clase aquí http://www.ruby-doc.org/core-2.1.2/IO.html

Mehdi
fuente
2
Esto es más corto y cierra el archivo.
Rob
16

Respondiendo a mi propia pregunta aquí ... resulta que es una peculiaridad exclusiva de Windows que ocurre al leer archivos binarios (en mi caso, un JPEG) que requiere una bandera adicional en la llamada a la función open o File.open. Lo revisé open("/path/to/file", 'rb') {|io| a = a + io.read}y todo estuvo bien.

Steven
fuente
10
A menos que estés realmente concatenación de un montón de archivos en conjunto, me acaba de escribir que a medida:data = File.open("file", "rb") {|io| io.read}
Glenn Jackman
Señor, merece una medalla. Perdí horas tratando de averiguar por qué mis archivos adjuntos en PDF no se podían leer cuando se enviaban desde un servidor de Windows hasta que encontré esta respuesta.
Augusto Samamé Barrientos