Đọc nội dung của một tệp cục bộ thành một biến trong Rails


86

Tất cả những gì tôi muốn làm là lấy tất cả nội dung từ một tệp cục bộ và lưu trữ nó trong một biến. Làm sao?

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

chỉ cho tôi một phần của nó. Trong PHP, tôi mới sử dụng file_get_contents.


1
Tôi cảm thấy đây là một vấn đề duy nhất của Windows, bởi vì giải pháp này và giải pháp do zed_0xff đề xuất hoạt động hoàn toàn tốt trên Mac / Linux. Tôi biết rằng irb chuyển \ r \ n thành \ n khi thực hiện File.read ... có lẽ điều đó có liên quan ở đây?
Steven

Câu trả lời:


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

1
Tôi đã nghĩ vậy, nhưng điều đó mang lại cho tôi một chuỗi có độ dài 52. Kích thước tệp thực tế khi tôi truy cập File.size ("/ path / to / file") là 1676.
Steven

4
Điều đó không để lại tệp mở?
Tom Rossi

Tôi thích cái này! Nó sẽ được tốt đẹp để biết làm thế nào để giữ cho các tiêu đề từ kiểu nội dung tập tin
Tom Roggero

Điều này rất hữu ích để đọc mà không cần sử dụng khối, cho phép nội dung được phân tích cú pháp dễ dàng và đặt thành các biến có sẵn cho các khối khác mà không cần tạo lớp.
Andrew

3
Để giải quyết câu hỏi của @ TomRossi - không, điều này không để tệp mở. Gọi read trên lớp File sẽ mở, đọc và đóng tệp. Tuy nhiên, việc gọi read trên một thể hiện của tệp (phải được mở trước) sẽ không đóng nó. Phương thức đang được gọi ở đây là ruby-doc.org/core-2.5.0/IO.html#method-c-read trái ngược với ruby-doc.org/core-2.5.0/IO.html#method-i- đọc
AndrewKS

18

Tôi nghĩ bạn nên cân nhắc sử dụng IO.binread("/path/to/file")nếu bạn có trình thông dịch ruby ​​gần đây (tức là> = 1.9.2)

Bạn có thể tìm IOtài liệu về lớp học tại đây http://www.ruby-doc.org/core-2.1.2/IO.html


2
Điều này ngắn hơn và đóng tệp cho bạn.
Rob

16

Trả lời câu hỏi của riêng tôi ở đây ... hóa ra đó là một điều khó hiểu duy nhất của Windows xảy ra khi đọc các tệp nhị phân (trong trường hợp của tôi là JPEG) yêu cầu một cờ bổ sung trong lệnh gọi hàm open hoặc File.open. Tôi đã sửa lại nó thành open("/path/to/file", 'rb') {|io| a = a + io.read}và tất cả đều ổn.


10
Trừ khi bạn đang thực sự concatenating một loạt các tập tin với nhau, tôi chỉ muốn viết rằng:data = File.open("file", "rb") {|io| io.read}
glenn Jackman

Ngài xứng đáng được nhận huy chương. Tôi đã mất hàng giờ cố gắng tìm ra lý do tại sao các tệp đính kèm PDF của tôi không thể đọc được khi được gửi từ máy chủ Windows cho đến khi tôi tình cờ tìm được câu trả lời này.
Augusto Samamé Barrientos,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.