2012-12-11 31 views
5

Tôi đã tự hỏi điều gì sẽ là một cách hay để quét một thư mục có các ký tự bạn không chắc chắn.Cách quét thư mục có ký tự đại diện với một thư mục con cụ thể

Ví dụ, tôi muốn quét

C: \ Program \ Version2 * \ Files

Nghĩa

  • Thư mục nằm trong C:\Program
  • Version2.*. có thể là bất cứ thứ gì như Version2.33, Version2.1, v.v.
  • Đó thư mục có một thư mục có tên Files trong đó

Tôi biết rằng tôi có thể làm một cái gì đó giống như foreach (directory) if contains("Version2."), nhưng tôi đã tự hỏi nếu có một cách tốt hơn để làm như vậy.

+0

Các bạn đã thử các [Directory.GetFiles chức năng] (http://msdn.microsoft.com/en-us/library/wz42302f.aspx)? Tôi không chắc chắn nếu điều đó sẽ bao gồm một số thư mục, nhưng nó có '*' làm ký tự đại diện – Default

+0

Có thể trùng lặp: http://stackoverflow.com/questions/7286477/possible-to-specify-directory-path-with-a- wildcard – Default

+0

@Default, câu trả lời đó rất hữu ích, khi ký tự đại diện ở cuối con đường, không phải ở giữa dường như trong câu hỏi này. –

Trả lời

6

Directory.EnumerateDirectories chấp nhận mẫu tìm kiếm. Vì vậy, liệt kê cha mẹ có ký tự đại diện và hơn liệt kê các phần còn lại:

var directories = 
    Directory.EnumerateDirectories(@"C:\Program\", "Version2.*") 
    .SelectMany(parent => Directory.EnumerateDirectories(parent,"Files")) 

Lưu ý: nếu con đường có thể chứa các kí hiệu trên mọi cấp độ - chỉ cần bình thường hóa đường dẫn và chia bởi "\", hơn thu thập mức độ thư mục bằng cấp.

+0

Có lý do nào để sử dụng EnumerateDirectories thay vì GetDirectories không? – Default

+2

@Default EnumerateDirectories sử dụng đánh giá lười biếng, vì vậy có thể nhanh hơn cho số lượng lớn các tệp/thư mục (kiểm tra phần nhận xét của MSDN [link] (http://msdn.microsoft.com/en-us/library/dd383572 (v = vs .100) .aspx)) –

+0

Điều này dường như phù hợp nhất với những gì tôi hiện đang tìm kiếm (: Tôi sẽ thử lại sớm. Cảm ơn! –

1

Hãy thử điều này

var pattern = new Regex(@"C:\\Program\\Version 2(.*)\\Files(.*)"); 

var directories = Directory.EnumerateDirectories(@"C:\Program", "*", 
               SearchOption.AllDirectories) 
               .Where(d => pattern.IsMatch(d)); 
+0

+1. Có thể hoạt động, nhưng có khả năng tìm cách thêm trực tiếp - sẽ yêu cầu bổ sung –

+0

Bạn hoàn toàn đúng, đã thêm lọc vào câu trả lời của tôi –

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