2012-01-19 52 views
14

Tôi đang sử dụng Ruby 1.9 để mở một số tệp và sao chép chúng vào tệp lưu trữ. Bây giờ có một số tập tin nhị phân, nhưng một số thì không. Vì Ruby 1.9 không tự động mở tệp nhị phân dưới dạng tệp nhị phân, có cách nào để tự động mở chúng không? (Vì vậy, ".class" sẽ là nhị phân, ".txt" không)Tự động mở tệp dưới dạng nhị phân với Ruby

Trả lời

30

Thực ra, câu trả lời trước đó của Alex D chưa hoàn thành. Trong khi đó là sự thật rằng không có chế độ "văn bản" trong các hệ thống tập tin Unix, Ruby không tạo sự khác biệt giữa việc mở tập tin trong chế độ nhị phân và phi nhị phân:

s = File.open('/tmp/test.jpg', 'r') { |io| io.read } 
s.encoding 
=> #<Encoding:UTF-8> 

là khác nhau từ (chú ý "rb")

s = File.open('/tmp/test.jpg', 'rb') { |io| io.read } 
s.encoding 
=> #<Encoding:ASCII-8BIT> 

Cách thứ hai, như là docs nói, đặt mã hóa bên ngoài thành ASCII-8BIT, thông báo cho Ruby không cố gắng diễn giải kết quả tại UTF-8. Bạn có thể đạt được điều tương tự bằng cách đặt mã hóa một cách rõ ràng với s.force_encoding('ASCII-8BIT'). Đây là điều quan trọng nếu bạn muốn đọc nhị phân thành chuỗi và di chuyển chúng xung quanh (ví dụ: lưu chúng vào cơ sở dữ liệu, v.v.).

2

Trên nền tảng giống Unix, không có sự khác biệt giữa mở tệp trong chế độ "nhị phân" và "văn bản". Trên Windows, chế độ "văn bản" chuyển đổi ngắt dòng sang kiểu DOS và chế độ "nhị phân" thì không.

Trừ khi bạn cần chuyển đổi dòng trên nền tảng Windows, chỉ cần mở tất cả các tệp ở chế độ "nhị phân". Không có hại trong việc đọc một tập tin văn bản trong chế độ "nhị phân".

Nếu bạn thực sự muốn phân biệt, bạn sẽ phải khớp với File.extname (tên tệp) dựa vào danh sách các tiện ích mở rộng đã biết như ".txt" và ".class".

+2

Lưu ý rằng câu trả lời này là sai. Ruby đọc vào một chuỗi, và đến 1.9 chuỗi đó có một mã hóa liên kết với nó. Xem thêm câu trả lời cao cấp để biết chi tiết và bỏ qua điều này. Nếu Alex có thể xóa nó sẽ thích hợp hơn. –

+0

Nếu tôi chỉ xóa nó, câu trả lời hiện tại sẽ không có ý nghĩa ("câu trả lời của AlexD ..."). Sẽ tốt hơn nếu thông tin trong câu trả lời này (đề cập đến ảnh hưởng của lá cờ 'b' trên chuyển đổi dòng) được hợp nhất với thông tin ở đầu kia. –

9

Kể từ của Ruby 1.9.1 có một phương pháp riêng biệt cho việc đọc nhị phân (IO.binread) và kể từ 1.9.3 có một cho văn bản (IO.binwrite) cũng như:

Để đọc:

content = IO.binread(file) 

Đối viết:

IO.binwrite(file, content) 

Kể từ IO là lớp cha của File, bạn cũng có thể làm wh sau ich có thể mang tính biểu cảm hơn:

content = File.binread(file) 
File.binwrite(file, content) 
+2

File.binread (file) cũng có thể là – peter

+1

Có, vì cha của lớp 'File' là lớp' IO'. –

Các vấn đề liên quan