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.


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

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


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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.