2009-01-13 10 views
8

निर्देशिका.गेटफ़ाइल (लोकलफ़ाइलपाथ, खोजपटल);फ़ाइल नामों को फ़िल्टर करना: * .abcd * या * .abcde के बिना * .abc प्राप्त करना, और

MSDN नोट्स:

जैसे कि ".txt", मिलान व्यवहार जब विस्तार के ठीक तीन वर्ण लंबा है जब विस्तार अधिक है की तुलना में अलग है एक searchPattern में तारांकन वाइल्डकार्ड वर्ण का उपयोग कर, या तीन वर्ण से कम लंबा। एक सटीक तीन वर्णों के फ़ाइल एक्सटेंशन के साथ एक खोज पैटर्न तीन या अधिक वर्णों का विस्तार करने वाली फ़ाइलों को लौटाता है, जहां पहले तीन वर्ण खोजपटल में निर्दिष्ट फ़ाइल एक्सटेंशन से मेल खाते हैं। एक, दो, या तीन से अधिक वर्णों के फ़ाइल एक्सटेंशन के साथ एक खोज पैटर्न केवल उस लम्बाई के एक्सटेंशन वाले फाइलों को लौटाता है जो खोज पैटर्न में निर्दिष्ट फ़ाइल एक्सटेंशन से मेल खाते हैं। प्रश्न चिह्न वाइल्डकार्ड वर्ण का उपयोग करते समय, यह विधि केवल उन फ़ाइलों को लौटाती है जो निर्दिष्ट फ़ाइल एक्सटेंशन से मेल खाते हैं। उदाहरण के लिए, दो फाइलें, "file1.txt" और "file1.txtother", निर्देशिका में, "फ़ाइल? .txt" का एक खोज पैटर्न केवल पहली फ़ाइल देता है, जबकि "फ़ाइल .txt" का एक खोज पैटर्न दोनों फाइलें देता है।

  • *.abc रिटर्न के .abc, .abcd, .abcde, .abcdef, और इतने पर ही विस्तार होने फाइलें:

निम्न सूची searchPattern पैरामीटर के लिए अलग-अलग लंबाई के व्यवहार को दर्शाता है।

  • *.abcd केवल .abcd का विस्तार करने वाली फ़ाइलों को लौटाता है।

  • *.abcde केवल .abcde का विस्तार करने वाली फ़ाइलों को लौटाता है।

  • *.abcdef केवल .abcdef का विस्तार करने वाली फ़ाइलों को लौटाता है।

  • searchPattern पैरामीटर *.abc करने के लिए सेट के साथ

    , मैं .abc का एक विस्तार, नहीं .abcd, .abcde और इतने पर होने फ़ाइलें कैसे लौट सकते हैं?

    हो सकता है कि इस समारोह काम करेगा:

    private bool StriktMatch(string fileExtension, string searchPattern) 
        { 
         bool isStriktMatch = false; 
    
         string extension = searchPattern.Substring(searchPattern.LastIndexOf('.')); 
    
         if (String.IsNullOrEmpty(extension)) 
         { 
          isStriktMatch = true; 
         } 
         else if (extension.IndexOfAny(new char[] { '*', '?' }) != -1) 
         { 
          isStriktMatch = true; 
         } 
         else if (String.Compare(fileExtension, extension, true) == 0) 
         { 
          isStriktMatch = true; 
         } 
         else 
         { 
          isStriktMatch = false; 
         } 
    
         return isStriktMatch; 
        } 
    

    परीक्षण कार्यक्रम:

    class Program 
    { 
        static void Main(string[] args) 
        { 
         string[] fileNames = Directory.GetFiles("C:\\document", "*.abc"); 
    
         ArrayList al = new ArrayList(); 
    
         for (int i = 0; i < fileNames.Length; i++) 
         { 
          FileInfo file = new FileInfo(fileNames[i]); 
          if (StriktMatch(file.Extension, "*.abc")) 
          { 
           al.Add(fileNames[i]); 
          } 
         } 
    
         fileNames = (String[])al.ToArray(typeof(String)); 
    
         foreach (string s in fileNames) 
         { 
          Console.WriteLine(s); 
         } 
    
         Console.Read(); 
        } 
    

    बाकी किसी को बेहतर समाधान?

    +0

    आप उससे अधिक संदर्भ देने जा रहे हैं ... – Eclipse

    उत्तर

    5

    कोई बग, विकृत लेकिन अच्छी तरह से प्रलेखित व्यवहार नहीं है। * .doc मैचों * .docx 8.3 फॉलबैक लुकअप पर आधारित है।

    आपको दस्तावेज़ में अंततः परिणामों को मैन्युअल रूप से पोस्ट-फ़िल्टर करना होगा।

    +0

    मेरे उत्तर को सही के रूप में हटा दिया गया है। – NotMe

    +0

    http://msdn.microsoft.com/en-us/library/wz42302f.aspx "जब * खोज में वाइल्डकार्ड पैटर्न, मिलान का व्यवहार बिल्कुल 3 वर्ण अलग होता है जब एक्सटेंशन अधिक या कम होता है 3 अक्षर से अधिक। " कितना परेशान है। –

    +0

    जानना अच्छा है। धन्यवाद! –

    9

    उत्तर यह है कि आप पोस्ट फ़िल्टरिंग कर सकते हैं। GetFiles अकेले नहीं कर सकता है। यहां एक उदाहरण दिया गया है जो आपके परिणामों को संसाधित करेगा। इसके साथ आप GetFiles के साथ एक खोज पैटर्न का उपयोग कर सकते हैं या नहीं - यह किसी भी तरह से काम करेगा।

    List<string> fileNames = new List<string>(); 
    // populate all filenames here with a Directory.GetFiles or whatever 
    
    string srcDir = "from"; // set this 
    string destDir = "to"; // set this too 
    
    // this filters the names in the list to just those that end with ".doc" 
    foreach (var f in fileNames.All(f => f.ToLower().EndsWith(".doc"))) 
    { 
        try 
        { 
         File.Copy(Path.Combine(srcDir, f), Path.Combine(destDir, f)); 
        } 
        catch { ... } 
    } 
    
    0

    उपयोग LINQ ....

    string strSomePath = "c:\\SomeFolder"; 
    string strSomePattern = "*.abc"; 
    string[] filez = Directory.GetFiles(strSomePath, strSomePattern); 
    
    var filtrd = from f in filez 
         where f.EndsWith(strSomePattern) 
         select f; 
    
    foreach (string strSomeFileName in filtrd) 
    { 
        Console.WriteLine(strSomeFileName); 
    } 
    
    0
    "* .abc" GetFiles के बाद 3 या उससे अधिक, कुछ भी एक्सटेंशन वापस आ जाएगी 3 की लंबाई के साथ के लिए के बाद से

    "।" एक सटीक मैच है, और अब कुछ भी नहीं है।

    string[] fileList = Directory.GetFiles(path, "*.abc"); 
    
    foreach (string file in fileList) 
    { 
        FileInfo fInfo = new FileInfo(file); 
    
        if (fInfo.Extension.Length == 4) // "." is counted in the length 
        { 
         // exact extension match - process the file... 
        } 
    } 
    

    ऊपर के प्रदर्शन के बारे में सुनिश्चित नहीं है - यह स्ट्रिंग जोड़तोड़ सरल लंबाई की तुलना के बजाय का उपयोग करता है, जबकि, नए FileInfo() पाश के आसपास हर बार कहा जाता है।

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