2009-01-13 30 views
8

Directory.GetFiles (LocalFilePath, searchPattern);Lọc tên tệp: nhận * .abc không có * .abcd hoặc * .abcde, v.v.

MSDN Ghi chú:

Khi sử dụng các nhân vật dấu ký tự đại diện trong một searchPattern, chẳng hạn như ".txt", hành vi phù hợp khi mở rộng là đúng ba ký tự khác với khi phần mở rộng là hơn hoặc dài hơn ba ký tự. Một searchPattern với một phần mở rộng tệp chính xác là ba ký tự trả về các tệp có phần mở rộng gồm ba ký tự trở lên, trong đó ba ký tự đầu tiên khớp với đuôi tệp được chỉ định trong searchPattern. Một đối tượng tìm kiếm có phần mở rộng tệp gồm một, hai hoặc nhiều hơn ba ký tự sẽ chỉ trả về các tệp có phần mở rộng chính xác với độ dài phù hợp với đuôi tệp được chỉ định trong searchPattern. Khi sử dụng ký tự đại diện dấu chấm hỏi, phương thức này chỉ trả về các tệp phù hợp với phần mở rộng tệp được chỉ định. Ví dụ: cho hai tệp, "file1.txt" và "file1.txtother", trong một thư mục, mẫu tìm kiếm của "tệp? .txt" chỉ trả lại tệp đầu tiên, trong khi mẫu tìm kiếm của "tệp .txt" trả về cả hai tập tin.

Danh sách sau đây cho thấy các hành vi có độ dài khác nhau cho các tham số searchPattern:

  • *.abc lợi nhuận file có một phần mở rộng của .abc, .abcd, .abcde, .abcdef, và vân vân.

  • *.abcd chỉ trả lại các tệp có phần mở rộng là .abcd.

  • *.abcde chỉ trả về các tệp có phần mở rộng là .abcde.

  • *.abcdef chỉ trả về các tệp có phần mở rộng là .abcdef.

Với searchPattern tham số thiết lập để *.abc, làm thế nào tôi có thể trả hồ sơ có một phần mở rộng của .abc, không .abcd, .abcde và vân vân?

Có lẽ chức năng này sẽ làm việc:

private bool StriktMatch(string fileExtension, string searchPattern) 
    { 
     bool isStriktMatch = false; 

     string extension = searchPattern.Substring(searchPattern.LastIndexOf('.')); 

     if (String.IsNullOrEmpty(extension)) 
     { 
      isStriktMatch = true; 
     } 
     else if (extension.IndexOfAny(new char[] { '*', '?' }) != -1) 
     { 
      isStriktMatch = true; 
     } 
     else if (String.Compare(fileExtension, extension, true) == 0) 
     { 
      isStriktMatch = true; 
     } 
     else 
     { 
      isStriktMatch = false; 
     } 

     return isStriktMatch; 
    } 

Chương trình thử nghiệm:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] fileNames = Directory.GetFiles("C:\\document", "*.abc"); 

     ArrayList al = new ArrayList(); 

     for (int i = 0; i < fileNames.Length; i++) 
     { 
      FileInfo file = new FileInfo(fileNames[i]); 
      if (StriktMatch(file.Extension, "*.abc")) 
      { 
       al.Add(fileNames[i]); 
      } 
     } 

     fileNames = (String[])al.ToArray(typeof(String)); 

     foreach (string s in fileNames) 
     { 
      Console.WriteLine(s); 
     } 

     Console.Read(); 
    } 

Bất kỳ ai khác tốt hơn giải pháp?

+0

Bạn sẽ có nhiều bối cảnh hơn ... – Eclipse

Trả lời

5

Không phải lỗi, hành vi hư hỏng nhưng được ghi chép đầy đủ. * .doc khớp * .docx dựa trên 8.3 tra cứu dự phòng.

Bạn sẽ phải tự lọc các kết quả để kết thúc bằng tài liệu.

+0

Đã xóa câu trả lời của tôi khi bạn nói đúng. – NotMe

+0

http://msdn.microsoft.com/en-us/library/wz42302f.aspx "Khi * ký tự đại diện trong một mẫu tìm kiếm, hành vi phù hợp khi phần mở rộng chính xác là 3 ký tự khác với khi phần mở rộng nhiều hơn hoặc ít hơn hơn 3 ký tự. " Cách gây kích ứng. –

+0

điều cần biết. cám ơn! –

9

Câu trả lời là bạn phải làm lọc bài đăng. Chỉ riêng GetFiles không thể làm điều đó. Dưới đây là ví dụ sẽ đăng quá trình của bạn. Với điều này, bạn có thể sử dụng một mẫu tìm kiếm với GetFiles hay không - nó sẽ hoạt động theo một trong hai cách.

List<string> fileNames = new List<string>(); 
// populate all filenames here with a Directory.GetFiles or whatever 

string srcDir = "from"; // set this 
string destDir = "to"; // set this too 

// this filters the names in the list to just those that end with ".doc" 
foreach (var f in fileNames.All(f => f.ToLower().EndsWith(".doc"))) 
{ 
    try 
    { 
     File.Copy(Path.Combine(srcDir, f), Path.Combine(destDir, f)); 
    } 
    catch { ... } 
} 
0

sử dụng LINQ ....

string strSomePath = "c:\\SomeFolder"; 
string strSomePattern = "*.abc"; 
string[] filez = Directory.GetFiles(strSomePath, strSomePattern); 

var filtrd = from f in filez 
     where f.EndsWith(strSomePattern) 
     select f; 

foreach (string strSomeFileName in filtrd) 
{ 
    Console.WriteLine(strSomeFileName); 
} 
0

Kể từ khi cho "* .abc" GetFiles sẽ trở lại phần mở rộng của 3 hoặc nhiều hơn, bất cứ điều gì với chiều dài 3 sau "" là đối sánh chính xác và mọi thứ không dài hơn.

string[] fileList = Directory.GetFiles(path, "*.abc"); 

foreach (string file in fileList) 
{ 
    FileInfo fInfo = new FileInfo(file); 

    if (fInfo.Extension.Length == 4) // "." is counted in the length 
    { 
     // exact extension match - process the file... 
    } 
} 

Không chắc chắn về hiệu suất của trên - trong khi nó sử dụng so sánh chiều dài đơn giản hơn là thao tác chuỗi, FileInfo() mới được gọi mỗi lần vòng lặp.

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