.net

2009-01-13 12 views
19

में रिकर्सिव फ़ाइल खोज मुझे एक विशेष फ़ाइल प्रकार (एक्सटेंशन जैसे .xml, .csv, .xls) के लिए एक ड्राइव (सी :, डी: आदि) खोजने की आवश्यकता है। मैं सभी निर्देशिकाओं और आंतरिक निर्देशिकाओं को लूप करने के लिए एक रिकर्सिव खोज कैसे पूर्ववत करूं और फ़ाइल कहां से पूरा पथ लौटा सकता हूं? या मुझे इस पर जानकारी कहां मिल सकती है?.net

VB.NET या सी #

धन्यवाद

संपादित ~ मैं जैसे कुछ त्रुटियों में चल रहा प्रणाली मात्रा का उपयोग का उपयोग करने के आदि से इंकार किसी को भी पता है जहां मैं एक फ़ाइल को लागू करने के लिए कुछ smaple कोड देख सकते हैं असमर्थ खोज? मुझे बस एक चयनित ड्राइव को खोजने की ज़रूरत है और सभी फाइलों के लिए फ़ाइल प्रकार का पूरा पथ लौटाएं।

उत्तर

20

इस बारे में कैसे? यह अक्सर निर्मित अंतर्निहित रिकर्सिव खोज द्वारा फेंक दिया गया अपवाद से बचाता है (यानी आपको एक फ़ोल्डर में एक्सेस-इनकार किया जाता है, और आपकी पूरी खोज मर जाती है), और आलसी मूल्यांकन किया जाता है (यानी यह परिणाम मिलने के बजाए परिणाम देता है, 2000 परिणाम बफरिंग)। आलसी व्यवहार आपको उत्तरदायी यूआई आदि बनाने देता है, और LINQ के साथ भी अच्छी तरह से काम करता है (विशेष रूप से First(), Take(), आदि)।

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
static class Program { // formatted for vertical space 
    static void Main() { 
     foreach (string match in Search("c:\\", "*.xml")) { 
      Console.WriteLine(match); 
     } 
    } 
    static IEnumerable<string> Search(string root, string searchPattern) { 
     Queue<string> dirs = new Queue<string>(); 
     dirs.Enqueue(root); 
     while (dirs.Count > 0) { 
      string dir = dirs.Dequeue(); 

      // files 
      string[] paths = null; 
      try { 
       paths = Directory.GetFiles(dir, searchPattern); 
      } catch { } // swallow 

      if (paths != null && paths.Length > 0) { 
       foreach (string file in paths) { 
        yield return file; 
       } 
      } 

      // sub-directories 
      paths = null; 
      try { 
       paths = Directory.GetDirectories(dir); 
      } catch { } // swallow 

      if (paths != null && paths.Length > 0) { 
       foreach (string subDir in paths) { 
        dirs.Enqueue(subDir); 
       } 
      } 
     } 
    } 
} 
+0

हम्म ... अभी नीले रंग से बाहर निकलना है - क्यों समझाया जाए? –

+1

शायद यह 'कैच {}' का उपयोग है। मेरा अपमान करने का मतलब नहीं है, लेकिन यह काफी बुरा अभ्यास है। AccessDeniedException या DirectoryNotFoudnException, या जो कुछ भी पकड़ने के लिए बेहतर ... एचटीएच – JamieH

+0

धन्यवाद मार्क। यह बढ़िया है। –

52
System.IO.Directory.GetFiles(@"c:\", "*.xml", SearchOption.AllDirectories); 
+0

मैं वास्तव में क्या चाहता था:

के रूप में उपयोग किया जाएगा। सरल और काम करता है। – NMunro

5

यह recls पुस्तकालय की तरह दिखता है - आरईसी ursive ls के लिए खड़ा है - अब एक pure .NET implementation है। मैं बस read about it in Dr Dobb's

using Recls; 
using System; 
static class Program { // formatted for vertical space 
    static void Main() { 
     foreach(IEntry e in FileSearcher.Search(@"c:\", "*.xml|*.csv|*.xls")) { 
      Console.WriteLine(e.Path); 
     } 
    }