2008-09-19 3 views
6

जिम्मेदार बताते हैं मैं DirectoryInfo.GetDirectories() उपयोग कर रहा हूँ रिकर्सिवली किसी विशेष पथ के तहत सभी उप-निर्देशिका खोजने के लिए। हालांकि, मैं सिस्टम फ़ोल्डरों को बाहर करना चाहता हूं और इसके लिए कोई स्पष्ट तरीका नहीं है। FindFirstFile/FindNextFile चीजों में विशेषताओं के साथ स्पष्ट थे।DirectoryInfo.GetDirectories() और

उत्तर

8

@rslite सही है, .नेट ऐसे छानने के बाहर के बॉक्स देना नहीं है, लेकिन इसे लागू करने के लिए मुश्किल नहीं है:

static IEnumerable<string> GetNonSystemDirs(string path) 
{ 
    var dirs = from d in Directory.GetDirectories(path) 
       let inf = new DirectoryInfo(d) 
       where (inf.Attributes & FileAttributes.System) == 0 
       select d; 

    foreach (var dir in dirs) 
    { 
     yield return dir; 
     foreach (var subDir in GetNonSystemDirs(dir)) 
     { 
      yield return subDir; 
     } 
    } 
} 

MSDN लिंक:

FileSystemInfo.Attributes Property

FileAttributes Enumeration

0

आप शायद परिणामों के माध्यम से पाश के लिए है और विशेषताओं है कि आप (गुण संपत्ति का उपयोग करें) नहीं करना चाहती के साथ उन लोगों को अस्वीकार चाहते हैं।

3

यह एक परिदृश्य में जहाँ Linq और विस्तार तरीकों चीजें वास्तव में स्वच्छ और आसान बनाने का एक बड़ा उदाहरण है।

public static DirectoryInfo[] GetNonSystemDirectories(
    this DirectoryInfo directory, 
    string searchPattern, 
    SearchOption searchOption) 
{ 
    return directory.GetDirectories(searchPattern, searchOption) 
     .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0) 
     .ToArray(); 
} 

आप एक .net v2 आवेदन का निर्माण कर रहे हैं, तो आप LinqBridge का उपयोग आप वस्तुओं तरीकों के सभी शांत Linq के लिए पहुँच (जैसे कहाँ() और toArray() ऊपर) देने के लिए कर सकते हैं।

संपादित

.net में v4 आप GetDirectories के बजाय EnumerateDirectories जो आप पहली बार स्मृति में एक सरणी के निर्माण के बिना परिणाम से अधिक चीज़ों को दोहरा सकते का उपयोग करेंगे।

public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
    this DirectoryInfo directory, 
    string searchPattern, 
    SearchOption searchOption) 
{ 
    return directory.EnumerateDirectories(searchPattern, searchOption) 
     .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0); 
} 
+0

Directory.GetDirectories रिटर्न तार का उपयोग करना, आप इसे कैसे से विशेषताएं मिलता है? :) – aku

+0

@aku मैं DirectoryInfo.GetDirectories उदाहरण विधि का उपयोग कर रहा हूं, निर्देशिका नहीं .GetDirectories स्थिर एक। –

+0

उपज रिटर्न का उपयोग करके एक वास्तविक रिकर्सिव इटरेटर बनाने के रूप में कुशल/प्रयोग योग्य नहीं है। SearchOption.AllDirectories का उपयोग करके बड़ी निर्देशिका पदानुक्रमों पर इतना अच्छा नहीं है। – Ash

0

परम मीठा Linq

IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName); 
संबंधित मुद्दे