2011-10-13 28 views
5

Tôi đang cố gắng liệt kê các tập tin trên máy tính của tôi bằng cách sử dụng mã bên dưới nhưng mỗi khi nó truy cập một tập tin hoặc thư mục mà tôi không có quyền đọc nó sẽ ném một ngoại lệ. Có cách nào tôi có thể tiếp tục tìm kiếm sau khi ngoại lệ đã được ném không? Tôi biết một số người đã có vấn đề tương tự nhưng có cách nào khác để làm điều này khác hơn là kiểm tra từng tập tin/thư mục cá nhân?Liệt kê các tập tin Ném ngoại lệ

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

Cảm ơn bạn đã trợ giúp vì điều này khiến tôi phát điên!

Trả lời

10

Tôi đã gặp phải vấn đề tương tự ngay hôm nay. Tôi đã tấn công cùng mã sau. Nếu bạn muốn sử dụng nó trong một sản phẩm thực tế, bạn có thể cần phải cải thiện xử lý lỗi. Vì đây là một kịch bản một lần, tôi không quan tâm nhiều lắm.

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

Để sử dụng nó, bạn có thể:

string[] files = EnumerateFilesRecursive(@"C:\").ToArray();//Note the ToArray() 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 

lần đầu tiên liệt kê tất cả các file, lưu trữ tất cả tên tập tin trong bộ nhớ và chỉ sau đó hiển thị chúng. Hoặc bạn có thể:

IEnumerable<string> files = EnumerateFilesRecursive(@"C:\");//Note that there is NO ToArray() 
foreach (string file in files) 
{ 
    Console.WriteLine(file); 
} 

Viết trong khi liệt kê và do đó không cần giữ tất cả tên tệp trong bộ nhớ cùng một lúc.

+0

Thật tuyệt vời, cảm ơn bạn rất nhiều vì đã chia sẻ mã của bạn. Tôi không thể làm việc như thế nào để có được nó làm việc mặc dù, tôi không phải là rất có kinh nghiệm với C#. Tôi đã thử gọi nó như là một phương pháp giả sử rằng chuỗi gốc và chuỗi mẫu sẽ được args nhưng không may mắn, tôi chỉ muốn xuất nó vào giao diện điều khiển với Console.WriteLine(), nơi nào tôi phù hợp với điều này? Cảm ơn! –

+0

Tôi ước tôi có thể cung cấp cho bạn +100! Điều đó làm việc hoàn hảo, cảm ơn bạn rất nhiều! –

Các vấn đề liên quan