2012-03-22 14 views
28

Tüm xml dosyalarının bir listesini bana döndüren bir dizin aracılığıyla dosyaları tekrarlı olarak aramak için aşağıdaki kodu kullanıyorum. Tümü iyi çalışır, ancak kök dizindeki xml dosyaları listede yer almaz.Dizinler içinde tekrarlı olarak dosya aranıyor

Neden olduğunu anladım, ilk yapacağı şey, kök dizinlerini almak, sonra dosyaları almak, böylece GetFiles() çağrısı kökte eksik. GetFiles() çağrısını foreach'den önce eklemeyi denedim, ancak sonuçlar beklediğim gibi değil.

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

Kod döner:

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; 
} 

Benim dizin yapısı gibi bir şey

test2.0.xml 
test2.1.xml 
test3.0.xml 
test3.1.xml 
ben dahil olmak üzere her dosyayı dönmek istiyorum

:

test1.0.xml 
test1.1.xml 
test1.2.xml 

Pek iyi recursi ile ayet üzerinde. Herhangi bir işaretçi çok takdir edilecektir.

+4

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

cevap

67

Sizin için alt dizinleri araştıran this overload of Directory.GetFiles kullanabilirsiniz. Bu ardışık tüm xml dosyalarını döndüren

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

' var fileList = Yeni DirectoryInfo (sdir) .GetFiles (SearchOption.AllDirectories "* XML."); ' –

+1

Birden fazla arama modeli girebilir miyim? * .xml dosya türleri artı * .doc örneğin ... – Paul

+1

Anlatabildiğim kadarıyla değil, ilgili dizin yapısı ilk aramadan sonra önbelleğe alınabilir. Testiniz hız söz konusu olduğunda kontrol edilebilecektir. –

3

Döngüleri dosyalar üzerinde döngüden önce veya sonra, ancak yaptığınız gibi iç içe yerleştirmemişsiniz.

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

aşağıdaki yöntemi deneyin klasörleri için döngü dışında dosyalar için döngü taşımak için karınca. Ek olarak, dosya koleksiyonunu tutan veri yapısını, yöntemin her çağrısına iletmeniz gerekir. Bu şekilde tüm dosyalar tek bir listeye gider. Daha sonra bunu böyle adlandırın.

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

Güncelleme: Zaten başka bir cevap okuyana kadar, zaten bu iş için bir yerleşik bir mekanizma yoktur, bana

Eh habersizce. Kodunuzun çalışmasını sağlamak için nasıl değiştirilmesinin gerektiğini görmek istediğinizde cevabımı bırakacağım.

1

Alacaksın w

+0

Çalışmıyor. 'f' tanımlı değil. – Bernard

+0

@Bernard: Yup, kopyala yapıştır ... düzeltildi. Teşekkürler. –

3

Birini kullanmak yerine üç liste oluşturuyorsunuz (DirSearch(d) dönüş değerini kullanmıyorsunuz).

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

böyle bir şey yapabilirsiniz: Sen durumunu kaydetmek için bir parametre olarak bir listeyi kullanabilirsiniz. Düşünce dizinlerini yinelemek için AllDirectories'i kullanın.

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

iç içe dizinleri dosyaları almak için EnumerateFiles kullanma:

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); 
    } 
} 
İlgili konular