2010-12-12 39 views
5

Tôi đang sử dụng Directory.GetFiles() để liệt kê các tệp theo mẫu đã cho. Điều này phù hợp với hầu hết các mẫu tôi đang tìm kiếm (ví dụ: zip, rar, sfv).Directory.GetFiles() mẫu khớp trong C#

Đây là cách tôi chuẩn bị danh sách (nhiều hơn hoặc ít hơn). Vấn đề là với mẫu số từ 0,001 đến .999 mà tôi muốn liệt kê.

alArrayPatternText.Add("*.zip"); 
alArrayPatternText.Add("*.sfv"); 
alArrayPatternText.Add("*.r??"); 
alArrayPatternText.Add("*.001"); 
for (int i = 2; i <= 999; i++) 
{ 
    string findNumber = String.Format("{0:000}", i); 
    alArrayPatternText.Add("*." + findNumber); 
} 

sau đó tôi gọi

string[] files = Directory.GetFiles(strDirName, varPattern); 

cho mỗi mẫu trong mảng mà có vẻ như ý tưởng rất xấu để làm như vậy kể từ khi danh sách có 1.002 bài dự thi và kiểm tra nếu thư mục đã từng trong số họ chỉ là một chút quá tốn thời gian.

Có cách nào tốt hơn để làm như vậy không?

Trả lời

5

Bạn nên gọi Directory.EnumerateFiles("path", "*") và sau đó sử dụng LINQ để lọc đường dẫn bằng cách gọi Path.GetExtension.

Ví dụ:

var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { 
    ".zip", ".sfv" 
}; 
extensions.UnionWith(Enumerable.Range(1, 998).Select(i => i.ToString(".000"))); 
var files = Directory.EnumerateFiles("path", "*") 
      .Where(p => extensions.Contains(Path.GetExtension(p)) 
        || Path.GetExtension(p).StartsWith(".r", StringComparison.OrdinalIgnoreCase)); 
+0

Cảm ơn, mà nên làm điều đó :-) – MadBoy

+0

Hrmms, dường như có một cái gì đó sai, 000-999 không được chuyển đổi độc đáo. Nó cho thấy là 1.000 2.000 vv và thậm chí cả thư mục có các tập tin zip và 001 không trả lại bất cứ điều gì cho các tập tin ..:/ – MadBoy

+0

Có thể là một vấn đề định dạng chuỗi. Thử thay thế: i => i.ToString (". 000") với: i => "." + i –

0

phương pháp cuối cùng của tôi dựa trên SLaks trả lời cho bất cứ ai tìm kiếm giải pháp tương tự

private static IEnumerable<string> DirectoryGetFiles(string strDirName, SearchOption varOption) { 
var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ".zip", ".sfv" }; 
    extensions.UnionWith(Enumerable.Range(1, 999).Select(i => String.Format(".{0:000}", i))); 
    extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".r{0:00}", i))); 
    extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".s{0:00}", i))); 
    extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".t{0:00}", i))); 
    return Directory.EnumerateFiles(strDirName, "*.*", varOption).Where(p => extensions.Contains(Path.GetExtension(p))).ToList(); 
}