2010-03-01 11 views
8

मैं रूबी में एक प्रोग्राम लिख रहा हूं जो निर्देशिका में टेक्स्ट फ़ाइलों में तारों की खोज करेगा - Grep के समान।रूबी: यह निर्धारित करने के लिए कि फ़ाइल को पढ़ने के लिए बाइनरी या टेक्स्ट

मैं नहीं चाहता कि यह बाइनरी फाइलों में खोज करने का प्रयास करे, लेकिन मुझे यह निर्धारित करने के लिए रूबी में कोई रास्ता नहीं मिल रहा है कि फ़ाइल बाइनरी या टेक्स्ट है या नहीं।

कार्यक्रम को विंडोज और लिनक्स दोनों पर काम करने की आवश्यकता है।

यदि कोई मुझे सही दिशा में इंगित कर सकता है तो यह बहुत अच्छा होगा।

धन्यवाद,

Xanthalas

उत्तर

5
gem install ptools 
require 'ptools' 
File.binary?(file) 
+0

धन्यवाद Johannes और quadruplebucky । मैं दोनों उत्तरों को वोट दूंगा लेकिन मेरे पास अभी तक 15 प्रतिष्ठा नहीं है। – Xanthalas

+1

-1। ptools 100% सटीक नहीं है। आपको – puchu

+3

के बजाय माइम प्रकारों का उपयोग करना चाहिए। ट्यूटोल विधि गैर-लैटिन वर्णों (चीनी, आदि) में "बाइनरी" के रूप में लिखी गई यूटीएफ -8 टेक्स्ट फ़ाइलों की पहचान करेगी। @puchu के रूप में, इसके बजाय माइम प्रकार का उपयोग करें। – bhollis

13

libmagic एक पुस्तकालय जो फ़ाइल प्रकार का पता लगाता है। इस समाधान के लिए मुझे लगता है कि सभी mimetype जो text/ से शुरू होते हैं, टेक्स्ट फ़ाइलों का प्रतिनिधित्व करते हैं। Eveything और एक बाइनरी फ़ाइल है। यह धारणा सभी माइम प्रकारों (उदाहरण के लिए एप्लिकेशन/एक्स-लेटेक्स, एप्लिकेशन/जेसन) के लिए सही नहीं है, लेकिन libmagic detect इन्हें टेक्स्ट/सादे के रूप में पहचानती है।

require "filemagic" 

def binary?(filename) 
    begin 
    fm= FileMagic.new(FileMagic::MAGIC_MIME) 
    !(fm.file(filename)=~ /^text\//) 
    ensure 
    fm.close 
    end 
end 
+0

धन्यवाद, यह एक बड़ी मदद थी। ध्यान दें कि इस कोड को चलाने के लिए आपको [ruby-filemagic] (https://github.com/blackwinter/ruby-filemagic) मणि की आवश्यकता है। –

+1

नोट करें कि आप 'foo! ~ Bar 'के बजाय' foo! ~ Bar' का उपयोग कर सकते हैं 'foo = ~ bar)' – bfontaine

2

ruby-filemagic मणि का उपयोग कर के लिए एक वैकल्पिक file आदेश है कि ज्यादातर यूनिक्स की तरह ऑपरेटिंग सिस्टम के साथ जहाजों पर भरोसा करने के लिए है। मेरा मानना ​​है कि यह हुड के तहत उसी libmagic लाइब्रेरी का उपयोग करता है लेकिन आपको ruby-filemagic मणि संकलित करने के लिए आवश्यक विकास फ़ाइलों की आवश्यकता नहीं है। यह सहायक है यदि आप ऐसे माहौल में हैं जहां अतिरिक्त पुस्तकालयों (जैसे हेरोकू) स्थापित करने के लिए यह थोड़ा सा काम है।

man file के अनुसार

, पाठ फ़ाइलें आमतौर पर अपने विवरण में शब्द text में शामिल होंगे:

$ file Gemfile 
Gemfile: ASCII text 

आप रूबी के माध्यम से फ़ाइल आदेश चला सकते हैं आउटपुट को कैप्चर कर सकते हैं:

require "open3" 

def text_file?(filename) 
    file_type, status = Open3.capture2e("file", filename) 
    status.success? && file_type.include?("text") 
end 
संबंधित मुद्दे

 संबंधित मुद्दे