Ler o conteúdo de um arquivo local em uma variável no Rails

86

Tudo que eu quero fazer é pegar todo o conteúdo de um arquivo local e armazená-lo em uma variável. Como?

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

só me dá uma parte disso. Em PHP, acabei de usar file_get_contents.

Steven
fonte
1
Eu sinto que este é um problema exclusivamente do Windows, porque esta solução, e a proposta por zed_0xff, funcionam perfeitamente bem no Mac / Linux. Eu sei que irb muda \ r \ n para \ n ao fazer File.read ... talvez isso seja relevante aqui?
Steven

Respostas:

163
data = File.read("/path/to/file")
zed_0xff
fonte
1
Eu pensei isso, mas isso me dá uma string de comprimento 52. O tamanho real do arquivo quando eu vou File.size ("/ caminho / para / arquivo") é 1676.
Steven
4
Isso não deixa o arquivo aberto?
Tom Rossi
Eu gosto deste! Seria bom saber como manter os cabeçalhos do tipo de conteúdo do arquivo
Tom Roggero
Isso é útil para ler sem o uso de um bloco, permitindo que o conteúdo seja facilmente analisado e configurado para variáveis ​​disponíveis para outros blocos, sem a necessidade de criar uma classe.
Andrew
3
Para responder à pergunta de @TomRossi - não, isso não deixa o arquivo aberto. Chamar read na classe File abre, lê e fecha o arquivo. No entanto, chamar read em uma instância de arquivo (que teve que ser aberta primeiro) não fecha. O método chamado aqui é ruby-doc.org/core-2.5.0/IO.html#method-c-read em oposição a ruby-doc.org/core-2.5.0/IO.html#method-i- ler
AndrewKS
18

Acho que você deve considerar o uso IO.binread("/path/to/file")se tiver um intérprete de ruby ​​recente (ou seja,> = 1.9.2)

Você pode encontrar a IOdocumentação da aula aqui http://www.ruby-doc.org/core-2.1.2/IO.html

Mehdi
fonte
2
Isso é mais curto e fecha o arquivo para você.
Rob
16

Respondendo minha própria pergunta aqui ... acontece que é uma peculiaridade do Windows que acontece ao ler arquivos binários (no meu caso, um JPEG) que requer um sinalizador adicional na chamada de função open ou File.open. Eu revisei para open("/path/to/file", 'rb') {|io| a = a + io.read}e estava tudo bem.

Steven
fonte
10
A menos que você esteja realmente concatenando um monte de arquivos, eu apenas escreveria como:data = File.open("file", "rb") {|io| io.read}
glenn jackman
Você, senhor, merece uma medalha. Perdi horas tentando descobrir por que meus anexos em PDF eram ilegíveis quando enviados de um servidor Windows até que me deparei com esta resposta.
Augusto Samamé Barrientos de