2011-10-13 26 views
5

Bilgisayarımdaki dosyaları aşağıdaki kodla numaralandırmaya çalışıyorum ancak her defasında bir dosya veya yön işaretine sahip olmadığımı okuyarak okuma iznim yok. Kural dışı durum atıldıktan sonra aramaya devam etmenin herhangi bir yolu var mı? Bazı insanların benzer sorunları olduğunu biliyorum, ancak her dosyayı/klasörü tek tek kontrol etmekten başka bir yolu var mı?Dosyaları Sıralamak Atanan Özel Durum

try 
{ 
string[] files = Directory.GetFiles(@"C:\", "*.*",SearchOption.AllDirectories); 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 
} 
catch 
{ 
} 

Bu beni deli ediyor gibi herhangi bir yardım için teşekkürler!

cevap

10

Sadece bugün aynı sorunla karşılaştım. Aşağıdaki kodu bir araya getirdim. Bunu gerçek bir üründe kullanmak istiyorsanız, hata işlemeyi iyileştirmeniz gerekebilir. Bu tek vuruşlu bir senaryo için olduğundan fazla umursamadı.

static IEnumerable<string> EnumerateFilesRecursive(string root,string pattern="*") 
{ 
    var todo = new Queue<string>(); 
    todo.Enqueue(root); 
    while (todo.Count > 0) 
    { 
     string dir = todo.Dequeue(); 
     string[] subdirs = new string[0]; 
     string[] files = new string[0]; 
     try 
     { 
      subdirs = Directory.GetDirectories(dir); 
      files = Directory.GetFiles(dir, pattern); 
     } 
     catch (IOException) 
     { 
     } 
     catch (System.UnauthorizedAccessException) 
     { 
     } 

     foreach (string subdir in subdirs) 
     { 
      todo.Enqueue(subdir); 
     } 
     foreach (string filename in files) 
     { 
      yield return filename; 
     } 
    } 
} 

şunlardan birini yapabilirsiniz Kullanmak için:

Lütfen tüm dosyaları, mağaza tüm dosya bellekte isimleri ve ancak o zaman görüntüler sıralar
string[] files = EnumerateFilesRecursive(@"C:\").ToArray();//Note the ToArray() 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 

. Alternatif şunları yapabilirsiniz:

numaralandırma ve böylece aynı anda bellekte tüm dosya adlarını tutmak gerekmez iken yazıyor
IEnumerable<string> files = EnumerateFilesRecursive(@"C:\");//Note that there is NO ToArray() 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 

.

+0

Bu harika, kodunuzu paylaştığınız için çok teşekkürler. Bununla çalışmayı nasıl başaramayacağım, C# ile çok tecrübeli değilim. Ben dize kök ve dize desen args ama şans, ben Console.WriteLine() ile konsol için çıktı isteyip istemediğinizi varsayarak bir yöntem olarak çağırmayı denedim? Teşekkürler! –

+0

Keşke sana +100 verebilirim! Bu mükemmel çalıştı, çok teşekkür ederim! –