2009-01-13 23 views
19

Bir bölümsel dosya türü (.xml, .csv, .xls gibi) için bir sürücü (C :, D: vb.) Araması yapmam gerekiyor. Tüm dizinleri ve iç dizinleri döngü ve dosya (lar) ın tam yolunu döndürmek için özyinelemeli bir aramayı nasıl hazırlarım? veya bu konuda nereden bilgi alabilirim?Özyinelemeli Dosya .net

VB.NET veya C#

Teşekkür

Düzenleme ~ ı gibi bazı hatalar çalıştırıyorum ben dosyasının uygulanmasıyla ilgili bazı smaple kodunu görebileceğiniz vb bilen var mı inkar sistem birimi erişimi erişemiyor arama? Sadece seçilen bir sürücüyü aramalı ve bulunan tüm dosyalar için dosya türünün tam yolunu döndürmeliyim.

cevap

20

Bu nasıl? Genellikle yerleşik özyinelemeli arama tarafından atılan istisnayı önler (yani, tek bir klasöre erişim engellendi ve tüm aramanız ölür) ve tembel olarak değerlendirilir (örneğin, sonuçları bulur bulmaz, sonuç verir) tamponlama 2000 sonuçları). Tembel davranış, duyarlı UI'ler vb. Oluşturmanızı sağlar ve ayrıca LINQ (özellikle First(), Take(), vb.) Ile iyi çalışır.

O recls kütüphaneyi andıran
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

Hmm ... maviden bir not düştü - nedenini açıklamaya dikkat et? –

+1

Belki de 'catch {}' kullanımıdır. Taciz etmek istemiyorum ama bu oldukça kötü bir uygulama. AccessDeniedException veya DirectoryNotFoudnException yakalamak için daha iyi ya da her neyse ... HTH – JamieH

+0

Teşekkürler Marc. Bu harika. –

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

:

olarak kullanılabilir ederim. Basit ve çalışır. – NMunro

5

- rec ursive ls açılımı - şimdi pure .NET implementation sahiptir. Ben sadece read about it in Dr Dobb's. Tam olarak ne istediğini

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