2009-11-03 38 views
7

Tôi có một thư mục với hai tập tin:Sử dụng Directory.GetFiles với regex giống như bộ lọc

  • Awesome.File.20091031_123002.txt
  • Awesome.File.Summary.20091031_123152.txt

bên cạnh đó, một ứng dụng của bên thứ ba xử lý các tập tin như sau:

  • Đọc một folderPathsearchPattern trên cơ sở dữ liệu
  • Thực thi Directory.GetFiles(folderPath, searchPattern), xử lý mọi tệp khớp với bộ lọc hàng loạt, sau đó di chuyển tệp vào thư mục lưu trữ.

Nó chỉ ra rằng tôi phải di chuyển hai tệp vào các thư mục lưu trữ khác nhau, vì vậy tôi cần xử lý chúng một cách riêng biệt bằng cách cung cấp các mẫu tìm kiếm khác nhau để chọn riêng lẻ. Xin lưu ý rằng tôi không thể sửa đổi ứng dụng của bên thứ ba, nhưng tôi có thể sửa đổi các điểm đến của tệp tìm kiếm và tệp trong cơ sở dữ liệu của mình.

Điều gì searchPattern sẽ cho phép tôi chọn Awesome.File.20091031_123002.txt mà không bao gồm Awesome.File.Summary.20091031_123152.txt?

+0

Họ luôn có định dạng 'Name.File.date_time.txt' và' Name.File.Summary.date_time.txt'? –

Trả lời

8

Awesome.File.????????_??????.txt

Dấu chấm hỏi (?) Đóng vai trò như một giữ chỗ nhân vật duy nhất.

+0

+1, + câu trả lời: awesomeness :) – Juliet

5

Theo số documentation, searchPattern chỉ hỗ trợ ***** và ? ký tự đại diện. Bạn sẽ cần phải viết bộ lọc regex của riêng bạn để lấy kết quả của Directory.GetFiles và áp dụng thêm logic lọc.

6

Tôi muốn thử kỹ năng LINQ ít ỏi của tôi ở đây ... Tôi chắc rằng có là một giải pháp thanh lịch hơn, nhưng đây là của tôi:

string pattern = ".SUMMARY."; 
string[] awesomeFiles = System.IO.Directory.GetFiles("path\\to\\awesomefiles"); 

     IEnumerable<string> sum_files = from file in awesomeFiles 
             where file.ToUpper().Contains(pattern) 
             select file; 

     IEnumerable<string> other_files = from file in awesomeFiles 
             where !file.ToUpper().Contains(pattern) 
             select file; 

này giả định không có bất kỳ tập tin khác trong thư mục khác với hai, nhưng bạn có thể điều chỉnh mẫu ở đây để phù hợp với nhu cầu của bạn (ví dụ: thêm "Awesome.File" vào mẫu bắt đầu.)

Khi bạn lặp lại bộ sưu tập, bạn sẽ nhận được những gì bạn cần.

+0

* sniff * Tôi bắt đầu trả lời trước khi tôi nhìn thấy sự chấp nhận. Oh well. Hãy tận hưởng nếu bạn có thể sử dụng :). –

+0

+1 để cổ vũ bạn :-) –

9

Nếu bạn đang đi để sử dụng LINQ sau đó ...

var regexTest = new Func<string, bool>(i => Regex.IsMatch(i, @"Awesome.File.(Summary)?.[\d]+_[\d]+.txt", RegexOptions.Compiled | RegexOptions.IgnoreCase)); 
    var files = Directory.GetFiles(@"c:\path\to\folder").Where(regexTest); 
0

Nếu bạn không muốn sử dụng LINQ, đây là một cách.

Public Sub FileChecker (ByVal filepath As String)

Dim di As New DirectoryInfo(filePath) 
    Dim _MatchCounter As Integer 
    Dim RegexPattern As String = "^[a-zA-Z_a-zA-Z_a-zA-Z_0-9_0-9_0-9.csv]*$" 
    Dim RegexPatternMatch As New Regex(RegexPattern, RegexOptions.IgnoreCase) 

    For Each matchingFile As FileInfo In di.GetFiles() 

     Dim m As Match = RegexPatternMatch.Match(matchingFile.Name) 

     If (m.Success) Then 
      MessageBox.Show(matchingFile.Name) 
      _MatchCounter += 1 
     End If 

    Next 

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