2012-01-19 20 views
14

के साथ बाइनरी के रूप में स्वचालित रूप से फ़ाइल खोलें मैं कई फाइलें खोलने के लिए रूबी 1.9 का उपयोग कर रहा हूं और उन्हें एक संग्रह में कॉपी कर रहा हूं। अब कुछ बाइनरी फाइलें हैं, लेकिन कुछ नहीं हैं। चूंकि रूबी 1.9 द्विआधारी फ़ाइलों को स्वचालित रूप से द्विआधारी के रूप में नहीं खोलता है, क्या वैसे भी उन्हें स्वचालित रूप से खोलने का कोई तरीका है? (तो ".class" बाइनरी होगा, ".txt" नहीं)रुबी

उत्तर

30

असल में, एलेक्स डी का पिछला जवाब अपूर्ण है। (ध्यान दें "rb")

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

से अलग है

: हालांकि यह सच यूनिक्स फाइल सिस्टम में कोई "पाठ" मोड है कि वहाँ है, रूबी द्विआधारी और गैर द्विआधारी मोड में फ़ाइलों को खोलने के बीच एक फर्क पड़ता है
s = File.open('/tmp/test.jpg', 'rb') { |io| io.read } 
s.encoding 
=> #<Encoding:ASCII-8BIT> 

उत्तरार्द्ध, docs कहता है, बाहरी एन्कोडिंग ASCII-8BIT पर सेट करें जो रूबी को यूटीएफ -8 में परिणाम की व्याख्या करने का प्रयास न करने के लिए कहता है। आप s.force_encoding('ASCII-8BIT') के साथ स्पष्ट रूप से एन्कोडिंग सेट करके वही चीज़ प्राप्त कर सकते हैं। यह कुंजी है यदि आप एक स्ट्रिंग में बाइनरी पढ़ना चाहते हैं और उन्हें चारों ओर ले जाना चाहते हैं (उदा। उन्हें डेटाबेस में सहेजना आदि)।

2

यूनिक्स-जैसी प्लेटफ़ॉर्म पर, "बाइनरी" और "टेक्स्ट" मोड में फ़ाइलों को खोलने के बीच कोई अंतर नहीं है। विंडोज़ पर, "टेक्स्ट" मोड लाइन ब्रेक को डॉस शैली में परिवर्तित करता है, और "बाइनरी" मोड नहीं करता है।

जब तक आपको विंडोज प्लेटफॉर्म पर लाइनबैक रूपांतरण की आवश्यकता नहीं है, तो बस "बाइनरी" मोड में सभी फ़ाइलों को खोलें। "बाइनरी" मोड में टेक्स्ट फ़ाइल पढ़ने में कोई हानि नहीं है।

यदि आप वास्तव में अंतर करना चाहते हैं, तो आपको ".txt" और ".class" जैसे ज्ञात एक्सटेंशन की सूची के विरुद्ध File.extname (फ़ाइल नाम) से मेल खाना पड़ेगा।

+2

ध्यान दें कि यह उत्तर गलत है। रूबी एक स्ट्रिंग में पढ़ता है, और 1.9 के रूप में स्ट्रिंग में इसके साथ जुड़े एन्कोडिंग होते हैं। विवरण के लिए अधिक अति-संशोधित उत्तर देखें और इसे अनदेखा करें। अगर एलेक्स इसे हटा सकता है जो बेहतर होगा। –

+0

अगर मैं इसे हटा देता हूं, तो मौजूदा उत्तर समझ में नहीं आता है ("एलेक्सडी द्वारा जवाब ...")। यह बेहतर होगा अगर इस उत्तर की जानकारी (लाइनबैक रूपांतरण पर 'बी' ध्वज के प्रभाव का जिक्र करते हुए) दूसरे के बारे में जानकारी के साथ समेकित की जाती है। –

9

के बाद रूबी 1.9.1 वहाँ द्विआधारी पढ़ने (IO.binread) के लिए एक अलग तरीका है और 1.9.3 के बाद से वहाँ लिखने के लिए एक (IO.binwrite) है और साथ ही:

content = IO.binread(file) 

:

पढ़ने के लिए लेखन के लिए:

IO.binwrite(file, content) 

IO के बाद से File की मूल वर्ग है, तो आप भी निम्न क कर सकता है ich शायद अधिक अभिव्यक्तिपूर्ण है:

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

File.binread (फ़ाइल) भी संभव है – peter

+1

हां, चूंकि 'फ़ाइल' वर्ग के माता-पिता' आईओ 'वर्ग हैं। –