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.


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")

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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.