อ่านเนื้อหาของไฟล์ในเครื่องลงในตัวแปรใน Rails


87

สิ่งที่ฉันต้องการทำคือรับเนื้อหาทั้งหมดจากไฟล์ในเครื่องและเก็บไว้ในตัวแปร อย่างไร?

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

ให้ฉันเป็นเพียงส่วนหนึ่งเท่านั้น ใน PHP ฉันเพิ่งใช้file_get_contentsไฟล์.


1
ฉันรู้สึกว่านี่เป็นปัญหาเฉพาะของ Windows เพราะวิธีแก้ปัญหานี้และวิธีที่ zed_0xff เสนอนั้นทำงานได้ดีอย่างสมบูรณ์บน Mac / Linux ฉันรู้ว่า irb เปลี่ยน \ r \ n เป็น \ n เมื่อทำ File.read ... อาจจะเกี่ยวข้องที่นี่?
สตีเวน

คำตอบ:


165
data = File.read("/path/to/file")

1
ฉันคิดอย่างนั้น แต่นั่นทำให้ฉันมีความยาว 52 ขนาดไฟล์จริงเมื่อฉันไปที่ File.size ("/ path / to / file") คือ 1676
Steven

4
มันไม่เปิดไฟล์ทิ้งไว้เหรอ?
Tom Rossi

ฉันชอบอันนี้! คงจะดีไม่น้อยหากทราบวิธีเก็บส่วนหัวจากประเภทเนื้อหาของไฟล์
Tom Roggero

สิ่งนี้มีประโยชน์ในการอ่านโดยไม่ต้องใช้บล็อกทำให้สามารถแยกวิเคราะห์เนื้อหาและตั้งค่าเป็นตัวแปรที่มีให้สำหรับบล็อกอื่นได้โดยไม่จำเป็นต้องสร้างคลาส
Andrew

3
เพื่อตอบคำถามของ @ TomRossi - ไม่สิ่งนี้จะไม่เปิดไฟล์ทิ้งไว้ การเรียกอ่านในคลาสไฟล์จะเปิดอ่านและปิดไฟล์ อย่างไรก็ตามการเรียกอ่านอินสแตนซ์ของไฟล์ (ซึ่งต้องเปิดก่อน) จะไม่ปิด วิธีที่ถูกเรียกที่นี่คือruby-doc.org/core-2.5.0/IO.html#method-c-readซึ่งตรงข้ามกับruby-doc.org/core-2.5.0/IO.html#method-i- อ่าน
AndrewKS

18

ฉันคิดว่าคุณควรพิจารณาใช้IO.binread("/path/to/file")หากคุณมีล่ามทับทิมล่าสุด (เช่น> = 1.9.2)

คุณสามารถดูIOเอกสารประกอบการเรียนได้ที่นี่http://www.ruby-doc.org/core-2.1.2/IO.html


2
ซึ่งจะสั้นกว่าและปิดไฟล์ให้คุณ
Rob

16

ตอบคำถามของฉันเองที่นี่ ... ปรากฎว่าเป็นเพียงมุมแหลมของ Windows เท่านั้นที่เกิดขึ้นเมื่ออ่านไฟล์ไบนารี (ในกรณีของฉันคือ JPEG) ที่ต้องใช้ค่าสถานะเพิ่มเติมในการเรียกฟังก์ชันเปิดหรือ File.open ฉันแก้ไขเป็นopen("/path/to/file", 'rb') {|io| a = a + io.read}และทุกอย่างเรียบร้อยดี


10
เว้นแต่คุณจะเชื่อมต่อไฟล์หลาย ๆ ไฟล์เข้าด้วยกันจริงๆฉันจะเขียนว่า:data = File.open("file", "rb") {|io| io.read}
glenn jackman

คุณชายสมควรได้รับเหรียญ ฉันเสียเวลาหลายชั่วโมงในการพยายามหาสาเหตุว่าทำไมไฟล์แนบ PDF ของฉันจึงไม่สามารถอ่านได้เมื่อส่งจากเซิร์ฟเวอร์ Windows จนกระทั่งฉันสะดุดกับคำตอบนี้
Augusto Samamé Barrientos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.