Baca konten file lokal ke dalam variabel di Rails

87

Yang ingin saya lakukan adalah mendapatkan semua konten dari file lokal dan menyimpannya dalam sebuah variabel. Bagaimana?

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

hanya memberi saya sebagian. Di PHP, saya baru saja menggunakan file_get_contents.

Steven
sumber
1
Saya merasa ini adalah masalah Windows yang unik, karena solusi ini, dan yang diusulkan oleh zed_0xff berfungsi dengan baik di Mac / Linux. Saya tahu bahwa irb berubah \ r \ n menjadi \ n ketika melakukan File.read ... mungkin itu relevan di sini?
Steven

Jawaban:

165
data = File.read("/path/to/file")
zed_0xff
sumber
1
Saya berpikir begitu, tapi itu memberi saya string dengan panjang 52. Ukuran file sebenarnya ketika saya membuka File.size ("/ path / to / file") adalah 1676.
Steven
4
Bukankah itu membiarkan file terbuka?
Tom Rossi
Saya suka yang ini! Alangkah baiknya mengetahui cara menyimpan header dari jenis konten file
Tom Roggero
Ini berguna untuk membaca tanpa menggunakan blok, memungkinkan konten diurai dengan mudah dan disetel ke variabel yang tersedia untuk blok lain tanpa perlu membuat kelas.
Andrew
3
Untuk menjawab pertanyaan @ TomRossi - tidak, ini tidak membiarkan file terbuka. Memanggil baca di kelas File membuka, membaca, dan menutup file. Namun, memanggil read pada sebuah instance file (yang harus dibuka terlebih dahulu) tidak menutupnya. Metode yang dipanggil di sini adalah ruby-doc.org/core-2.5.0/IO.html#method-c-read dibandingkan dengan ruby-doc.org/core-2.5.0/IO.html#method-i- baca
AndrewKS
18

Saya pikir Anda harus mempertimbangkan untuk menggunakan IO.binread("/path/to/file")jika Anda memiliki penerjemah ruby ​​baru-baru ini (yaitu> = 1.9.2)

Anda dapat menemukan IOdokumentasi kelas di sini http://www.ruby-doc.org/core-2.1.2/IO.html

Mehdi
sumber
2
Ini lebih pendek dan menutup file untuk Anda.
Rob
16

Menjawab pertanyaan saya sendiri di sini ... ternyata itu adalah kekhasan khusus Windows yang terjadi ketika membaca file biner (dalam kasus saya JPEG) yang memerlukan flag tambahan dalam pemanggilan fungsi open atau File.open. Saya merevisinya menjadi open("/path/to/file", 'rb') {|io| a = a + io.read}dan semuanya baik-baik saja.

Steven
sumber
10
Kecuali jika Anda benar-benar menggabungkan banyak file, saya hanya akan menulisnya sebagai:data = File.open("file", "rb") {|io| io.read}
glenn jackman
Anda tuan, berhak mendapatkan medali. Saya kehilangan waktu berjam-jam mencoba mencari tahu mengapa lampiran PDF saya tidak dapat dibaca ketika dikirim dari server Windows sampai saya menemukan jawaban ini.
Augusto Samamé Barrientos