2012-03-22 20 views
28

मेरे पास निम्न निर्देशिका में निर्देशिका के माध्यम से फ़ाइलों की खोज करने के लिए निम्न कोड है, जो मुझे सभी एक्सएमएल फाइलों की एक सूची देता है। सभी अच्छी तरह से काम करता है, सिवाय इसके कि रूट निर्देशिका में xml फ़ाइलों को सूची में शामिल नहीं किया गया है।निर्देशिका में फ़ाइल के लिए खोज रहे हैं

मैं समझता हूं कि क्यों पहली बात यह है कि रूट में निर्देशिकाएं प्राप्त होती हैं, फिर फ़ाइलों को प्राप्त करें, इस प्रकार रूट पर GetFiles() कॉल को याद रखें। मैंने foreach से पहले GetFiles() कॉल सहित कोशिश की, लेकिन परिणाम मुझे उम्मीद नहीं है।

RootDirectory 
     test1.0.xml 
      test1.1.xml 
      test1.2.xml 
    2ndLevDir 
      test2.0.xml 
      test2.1.xml 
    3rdLevDir 
       test3.0.xml 
       test3.1.xml 

कोड रिटर्न:

public static ArrayList DirSearch(string sDir) 
{ 
    try 
    { 
     foreach (string d in Directory.GetDirectories(sDir)) 
     { 
      foreach (string f in Directory.GetFiles(d, "*.xml")) 
      { 
       string extension = Path.GetExtension(f); 
       if (extension != null && (extension.Equals(".xml"))) 
       { 
       fileList.Add(f); 
       } 
      } 
      DirSearch(d); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
    return fileList; 
} 

मेरे निर्देशिका संरचना की तरह कुछ है

test2.0.xml 
test2.1.xml 
test3.0.xml 
test3.1.xml 

मैं सहित हर फ़ाइल वापस जाने के लिए करना चाहते हैं:

test1.0.xml 
test1.1.xml 
test1.2.xml 
नहीं

बहुत अच्छी तरह से रिकर्सि के साथ कविता पर। किसी भी प्वाइंटर की अत्यधिक सराहना की जाएगी।

+4

'Directory.EnumerateFiles (sDir," * .xml ", SearchOption.AllDirectories)' ' –

उत्तर

67

आप this overload of Directory.GetFiles जो आपके लिए उपनिर्देशिका खोज इस्तेमाल कर सकते हैं।

public static IEnumerable<string> GetXMLFiles(string directory) 
{ 
    List<string> files = new List<string>(); 

    try 
    { 
     files.AddRange(Directory.GetFiles(directory, "*.xml", SearchOption.AllDirectories)); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 

    return files; 
} 
+18

वर FileList = नए DirectoryInfo (sDir) .GetFiles (, SearchOption.AllDirectories" * एक्सएमएल। ");' –

+1

क्या मैं एकाधिक खोज पैटर्न दर्ज कर सकता हूं? * .xml फाइल प्रकार प्लस * .doc उदाहरण के लिए ... – Paul

+1

जहां तक ​​मैं कह सकता हूं, लेकिन प्रासंगिक खोज संरचना को पहली खोज के बाद कैश किया जाने की संभावना है। आपका परीक्षण यह जांचने में सक्षम होगा कि यदि गति चिंता का विषय है। –

3

निर्देशिकाओं पर लूप के पहले या बाद में आपके पास फ़ाइलों पर लूप होना चाहिए, लेकिन जैसा आपने किया है उसके अंदर घोंसला नहीं है।

foreach (string f in Directory.GetFiles(d, "*.xml")) 
{ 
    string extension = Path.GetExtension(f); 
    if (extension != null && (extension.Equals(".xml"))) 
    { 
     fileList.Add(f); 
    } 
} 

foreach (string d in Directory.GetDirectories(sDir)) 
{ 
    DirSearch(d); 
} 
3

निम्न विधि का प्रयास करें फ़ोल्डरों के लिए लूप के बाहर फ़ाइलों के लिए लूप को स्थानांतरित करने के लिए चींटी। इसके अतिरिक्त आपको विधि के प्रत्येक कॉल में फाइलों के संग्रह को रखने वाली डेटा संरचना को पारित करने की आवश्यकता होगी। इस तरह सभी फाइलें एक सूची में जाती हैं।

public static List<string> DirSearch(string sDir, List<string> files) 
{ 
    foreach (string f in Directory.GetFiles(sDir, "*.xml")) 
    { 
    string extension = Path.GetExtension(f); 
    if (extension != null && (extension.Equals(".xml"))) 
    { 
     files.Add(f); 
    } 
    } 
    foreach (string d in Directory.GetDirectories(sDir)) 
    { 
    DirSearch(d, files); 
    } 
    return files; 
} 

फिर इसे इस तरह कॉल करें।

List<string> files = DirSearch("c:\foo", new List<string>()); 

अद्यतन:

खैर मेरे लिए जानकारी के बिना, जब तक मैं अन्य जवाब वैसे भी पढ़ा है, वहाँ पहले से ही ऐसा करने के लिए अंतर्निहित तंत्र है। यदि आप यह देखने में रुचि रखते हैं कि यह आपके काम को बनाने के लिए आपके कोड को संशोधित करने की आवश्यकता है, तो मैं अपना उत्तर छोड़ दूंगा।

1

आप होगा डब्ल्यू

+0

काम नहीं करेगा। 'एफ' परिभाषित नहीं किया गया है। – Bernard

+0

@ बर्नार्ड: हाँ, कॉपी पेस्ट त्रुटि ... तय करें। धन्यवाद। –

3

आप एक का उपयोग करने के बजाय तीन सूचियां बना रहे हैं (आप DirSearch(d) के वापसी मूल्य का उपयोग नहीं करते हैं)।आप राज्य को बचाने के लिए एक पैरामीटर के रूप में एक सूची का उपयोग कर सकते हैं:

foreach (var file in Directory.GetFiles(MyFolder, "*.xml", SearchOption.AllDirectories)) 
     { 
      // do something with this file 
     } 
2

आप कुछ इस तरह कर सकते हैं। निर्देशिका निर्देशिकाओं की पुनरावृत्ति के लिए सभी निर्देशिका का उपयोग करें।

using System; 
using System.IO; 

class Program 
{ 
    static void Main() 
    { 
    // Call EnumerateFiles in a foreach-loop. 
    foreach (string file in Directory.EnumerateFiles(@"c:\files", 
     "*.xml", 
     SearchOption.AllDirectories)) 
    { 
     // Display file path. 
     Console.WriteLine(file); 
    } 
    } 
} 
0

EnumerateFiles का उपयोग नेस्ट निर्देशिकाओं की फ़ाइलें प्राप्त करने के लिए:

static void Main(string[] args) 
{ 
    var list = new List<string>(); 
    DirSearch(list, "."); 

    foreach (var file in list) 
    { 
    Console.WriteLine(file); 
    } 
} 

public static void DirSearch(List<string> files, string startDirectory) 
{ 
    try 
    { 
    foreach (string file in Directory.GetFiles(startDirectory, "*.*")) 
    { 
     string extension = Path.GetExtension(file); 

     if (extension != null) 
     { 
     files.Add(file); 
     } 
    } 

    foreach (string directory in Directory.GetDirectories(startDirectory)) 
    { 
     DirSearch(files, directory); 
    } 
    } 
    catch (System.Exception e) 
    { 
    Console.WriteLine(e.Message); 
    } 
} 
संबंधित मुद्दे