2013-05-17 7 views
5

का उपयोग कर किसी फ़ोल्डर में सभी फ़ाइलों को ढूंढना मैं उप निर्देशिकाओं के साथ-साथ खाते में किसी भी निर्देशिका के तहत सभी फ़ाइलों को सूचीबद्ध करने की कोशिश कर रहा हूं। मैं उपज का उपयोग कर रहा हूं ताकि मैं इसे ले जा सकूं जहां मैं इसे कहूं (ध्यान दें कि मैं .NET 3.5 का उपयोग कर रहा हूं)।गणना

नीचे मेरी कोड है:

IEnumerable<string> Search(string sDir) 
{ 
     foreach (var file in Directory.GetFiles(sDir)) 
     { 
      yield return file;     
     } 

     foreach (var directory in Directory.GetDirectories(sDir)) 
     { 
       Search(directory);     
     } 
} 

मैं नहीं जानता कि क्या गलत यहाँ जा रहा है, लेकिन यह केवल एक फ़ाइल (जो रूट निर्देशिका के तहत एक है देता है, और वहाँ केवल एक वहाँ के रूप में है कुंआ)। क्या आप कृपया मदद कर सकते हैं?

+12

पहिया को पुन: पेश न करें। 'Directory.EnumerateFiles' और 'Directory.EnumerateDirectories' का उपयोग करें। – Oded

+0

ओह, और आप 'खोज (निर्देशिका)' की 'उपज वापसी' नहीं कर रहे हैं, जो संभवतः यहां के मुद्दों में से एक है। – Oded

+0

धन्यवाद ओडेड .. निर्देशिका होगी। अन्युमरेटफाइल और निर्देशिका। अनन्य निर्देशिकाएं .NE 3.5 में काम करती हैं? – Mike

उत्तर

12

आप पुनरावर्ती खोज के परिणाम की जरूरत है अन्यथा आप सिर्फ अपने परिणामों बर्बाद कर रहे हैं:

IEnumerable<string> Search(string sDir) 
{ 
    foreach (var file in Directory.GetFiles(sDir)) 
    { 
     yield return file;     
    } 

    foreach (var directory in Directory.GetDirectories(sDir)) 
    { 
     foreach(var file in Search(directory)) 
      yield return file; 
    } 
} 

ध्यान रखें कि आपके आशय बस हर फ़ाइल की एक फ्लैट सूची प्राप्त करने के है अगर, सभी उपनिर्देशिकाओं को खोजने के विकल्प के साथ Directory.GetFiles का उपयोग करने पर विचार करें। यदि आपका इरादा खोज मानदंडों को लागू करने के लिए LINQ (या अन्य विधियों) का लाभ उठाने के लिए है या पुनर्प्राप्त फ़ाइलों की कुल संख्या की सीमा है, तो यह एक सभ्य तरीका है क्योंकि आप एक समय में निर्देशिकाएं पढ़ेंगे और एक बार ' आपने अपना मानदंड पूरा किया है।

+5

[निर्देशिका। गेटफाइल (स्ट्रिंग, स्ट्रिंग, सर्चऑप्शन)] (http://msdn.microsoft.com/en-us/library/ms143316.aspx) अधिक उपयुक्त हो? प्रौद्योगिकी के शिखर के साथ –

+0

एन्कोडिंग। – lsalamon

+0

कुछ मामलों में, इसका अपना संस्करण लिखना नेट 4 या बाद में भी आसान है - क्योंकि .NET 4 संस्करण में पहुंचने योग्य सिस्टम फ़ोल्डरों के कारण अपवादों को संभालने का कोई आसान तरीका नहीं है। कम से कम यदि आप अपना खुद का रोल करते हैं, तो आप उचित हैंडलिंग जोड़ सकते हैं। हालांकि, .NET 3.5 * के पास * निर्देशिका है। गेटफाइल (स्ट्रिंग, स्ट्रिंग, सर्चऑप्शन) 'जॉन एच कहते हैं! लेकिन मुझे यह बेहतर पसंद है। –