2015-11-14 2 views
9

मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जो स्थानीय एचडी, से सभी फ़ाइलों को पढ़ता है, मैं उन एक्सटेंशन को निर्दिष्ट करता हूं जिन्हें मैं खोज में शामिल करना चाहता हूं।फ़ाइल पठनीय है (पाठ को इसके बजाय सुलभ है)

सभी चुनी गई फ़ाइल सीमाएं इस तथ्य पर आधारित हैं कि फ़ाइल टेक्स्ट सामग्री है।

तो मेरे उपयोग के लिए मैं कौन से विस्तार acount में रखना निर्दिष्ट कर सकते हैं, इस तरह के

रूप .cs .html .htm .css .js आदि ' क्या मैं एक विशेषता यह है कि सामान्य उपयोगकर्ता दिया जाएगा जोड़ना चाहते हैं एक्सटेंशन का चयन करने के लिए और उसे सभी उपलब्ध विंडोज़ फ़ाइल एक्सटेंशन से चुनने दें, लेकिन उस सूची में केवल उन फाइलों को शामिल करने के लिए जो उनके सिस्टम में टेक्स्ट हैं। उदाहरण के लिए हम जानते हैं कि exe, mp3। एमजीपी, एवी नहीं हैं लेकिन उनके पास कुछ अन्य प्रकार की फाइलें (.extensions) हो सकती हैं जिन्हें हमने ध्यान में नहीं रखा था।

सिस्टम फ़ाइल प्रॉपर्टी, पर आधारित यह तय करने का कोई तरीका है कि केवल टेक्स्ट सामग्री फ़ाइलों को फ़िल्टर करने का तरीका क्या होगा?

+2

ऐसा करने का कोई अच्छा तरीका नहीं है ... तो हैकिश करें "पढ़ने की कोशिश करें और यदि आप सामग्री को समझ सकते हैं तो यह पाठ है" सर्वोत्तम "है। विषय पर पिछली चर्चाओं के लिए आप "एक्सटेंशन के बिना फ़ाइल प्रकार का पता लगाने" (या कुछ समान) खोजना चाहते हैं। –

+0

एक्सटेंशन केवल फ़ाइल की सामग्री का एक कमजोर संकेत प्रदान करते हैं। मैं शर्त लगाता हूं कि वहाँ ऐसे अनुप्रयोग हैं जो पाठ वाले इन फ़ाइलों के बिना '.cs' एक्सटेंशन का भी उपयोग करते हैं। –

+0

मुझे नहीं लगता कि एक है, कम से कम एक सामान्य नहीं है। उदाहरण के लिए: किसी शब्द फ़ाइल से एक्सटेंशन docx टेक्स्ट नहीं है, docx-files XML फ़ाइलों को ज़िपित कर रहे हैं। लेकिन एक उपयोगकर्ता के रूप में, आप शायद शब्द फ़ाइलों को पाठ माना जाएगा। –

उत्तर

3

विंडोज मशीनों के लिए एक तंत्र फ़ाइल एक्सटेंशन से जुड़े विंडोज रजिस्ट्री में सामग्री प्रकार को देखना है।

  • एक: फ़ाइल एक्सटेंशन है कि पाठ आधारित आम तौर पर एक या अधिक इन विशेषताओं के होना चाहिए रहे हैं (मैं एक सीधा रजिस्ट्री देखने के बिना यह करने के लिए एक तरह से के बारे में पता नहीं है।)

    रजिस्ट्री के भीतर, सामग्री प्रकार का संकेत पाठ के MIME प्राथमिक प्रकार, जैसे, text/plain या text/application

  • GUID {5e941d80-bf96-11cd-b579-08002b30bfeb} साथ text
  • डिफ़ॉल्ट हैंडलर की कथित प्रकार, सादा पाठ लगातार हैंडलर को सौंपा।

निम्न विधि इन विशेषताओं के साथ जुड़े सभी प्रणाली एक्सटेंशन वापस आ जाएगी:

// include using reference to Microsoft.Win32; 
static IEnumerable<string> GetTextExtensions() 
{ 
    var defaultcomp = StringComparison.InvariantCultureIgnoreCase; 
    var root = Registry.ClassesRoot; 
    foreach (var s in root.GetSubKeyNames() 
     .Where(a => a.StartsWith("."))) 
    { 
     using (RegistryKey subkey = root.OpenSubKey(s)) 
     { 
      if (subkey.GetValue("Content Type")?.ToString().StartsWith("text/", defaultcomp) == true) 
       yield return s; 
      else if (subkey.GetValue("PerceivedType")?.ToString().Equals("text", defaultcomp) == true) 
       yield return s; 
      else 
      { 
       using (var ph = subkey.OpenSubKey("PersistentHandler")) 
       { 
        if (ph?.GetValue("")?.ToString().Equals("{5e941d80-bf96-11cd-b579-08002b30bfeb}", defaultcomp) == true) 
         yield return s; 
       } 

      } 
     } 
    } 
} 

उत्पादन कार्य केंद्र विन्यास पर निर्भर करता है, लेकिन मेरे वर्तमान मशीन रिटर्न पर:

। ए, एडिन, .ans, .asc, .asm, .asmx, .aspx, .asx, .bas, .bat, .bcp, .c, .cc, .cd, .cls, .cmd, ...

हालांकि इस एप्लिकेशन इंस्टॉलर पर निर्भर करता है सही ढंग से फ़ाइल एक्सटेंशन मानचित्रण, यह प्रमुख पाठ फ़ाइल प्रकारों के सबसे पहचान करने के लिए प्रकट होता है।

+0

पी + 1! –

+0

btw माइक्रोसॉफ्ट.Win32 के संदर्भ में .. जहां आपने 'Win32' में किसी भी विधि को कॉल किया था? –

+0

@JbobJohan रजिस्ट्री कक्षाएं Microsoft.Win32 नामस्थान में हैं। – drf

0

सामान्यतः, ऐसा करने के लिए कोई अच्छा और विश्वसनीय तरीका नहीं है।

आप फ़ाइल एक्सटेंशन की तुलना करके निर्णय नहीं ले सकते हैं - यह केवल फ़ाइल नाम का एक हिस्सा है और हर कोई इसे बदल सकता है, इसलिए file.exe एक सादे-पाठ फ़ाइल हो सकती है।

C# - Check if File is Text Based
तुम बस पहले 1000 (मनमाना संख्या) पात्रों के माध्यम से जाँच करें और अगर वहाँ अमुद्रणीय चरित्र देख सकते हैं, या वे एक निश्चित सीमा में सभी ascii हैं।

+2

मुझे एहसास नहीं हुआ है कि _ "कोई रास्ता नहीं है" _ प्रोग्रामिंग के साथ एक विकल्प है, खासकर इस तरह के एक छोटे से काम में। –

+0

तो मुझे लगता है कि वर्कअराउंड आपको जो कुछ पता है उसे निर्दिष्ट करना है और उपयोगकर्ता को जोड़ने के लिए एक विकल्प जोड़ना है .. (और वह किसी भी को जोड़ने में सक्षम होगा !!) –

+0

यूनिकोड से सावधान रहें, इसमें अप्रतिबंधित –

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