2011-04-06 47 views
3

我想檢索一個擴展名與指定字符串完全匹配的文件列表。準確的文件擴展名匹配GetFiles()?

DirectoryInfo di = new DirectoryInfo(someValidPath); 
List<FileInfo> myFiles = new List<FileInfo>(); 
foreach (FileInfo fi in di.GetFiles("*.txt")) 
{ 
    myFiles.Add(fi); 
} 

我得到的文件擴展名爲*.txt但我也得到文件擴展名爲*.txtx,所以我所編碼的數額越來越其擴展開始與txt的文件。

這不是我想要的。我是否需要抓取所有文件名,並與"\\.txt$"(我認爲)進行正則表達式匹配,或者使用.EndsWith(".txt")等來測試每個文件名字符串,以完成此操作?

謝謝!

+0

是的,你這樣做。這是否很難,爲什麼你需要regulare表達? – sln 2011-04-06 21:19:58

+1

注意,*每個*答案忘記Windows文件名不區分大小寫。你也可以得到.TXT。文件名的外殼規則有點令人討厭,你可能想要檢查字符串的長度。 – 2011-04-06 22:06:25

+0

@Hans:好點。 Fredrik的答案是否處理了不區分大小寫的問題? – John 2011-04-07 02:26:11

回答

2

有點一種解決辦法,但你可以準確的篩選出與Where extesion方法匹配:

foreach (FileInfo fi in di.GetFiles("*.txt") 
    .Where(fi => string.Compare(".txt", fi.Extension, StringComparison.OrdinalIgnoreCase) == 0)) 
{ 
    myFiles.Add(fi); 
} 

注意,這將使擴展的不區分大小寫的匹配。

1

試試這個:

DirectoryInfo di = new DirectoryInfo(someValidPath); 
List<FileInfo> myFiles = 
    (
     from file in di.GetFiles("*.txt") 
     where file.Extension == ".txt" 
     select file 
    ).ToList(); 
2

正則表達式可能是矯枉過正。在FileInfo上使用擴展名。

foreach (FileInfo fi in di.GetFiles("*.txt").Where(f => f.Extension == ".txt")) 
{ 
    myFiles.Add(fi); 
} 
+0

,而不是foreach循環,你可以做'myFiles.AddRange(表達式)' – 2011-04-06 21:28:10

+0

@Chuck Savage:是「表達式」在'foreach'循環之後的部分? – John 2011-04-06 21:38:46

+0

我會做一個新的答案,所以你可以看到完整的代碼。 – 2011-04-06 21:50:12

1
DirectoryInfo di = new DirectoryInfo(someValidPath); 
List<FileInfo> myFiles = new List<FileInfo>(); 
foreach (FileInfo fi in di.GetFiles("*.txt")) 
{ 
    if (fi.Extension == ".txt") 
     myFiles.Add(fi); 
} 
0

你不能只是增加一個如果,並檢查文件名的最後四個字符?

0

如果您使用C#2.0 是不是更容易?

string fileExtensionFilter = "*.txt"; 
      DirectoryInfo di = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)); 
      List<FileInfo> myFiles = new List<FileInfo>(); 
      foreach (FileInfo fi in di.GetFiles(fileExtensionFilter)) 
      { 
       if (fi.Extension == fileExtensionFilter.Substring(1)) myFiles.Add(fi); 
      } 
3

使用列表的功能的AddRange而不是做foreach循環,並呼籲添加由下面的表達式(我保存到變量列表)返回的每個項目。

var list = di.GetFiles("*.txt").Where(f => f.Extension == ".txt"); 
myFiles.AddRange(list); 

我假定你只是向我們展示已經有了它的值,如果沒有,你可以做,而不是你的代碼和MYFILES的一個片段。

List<FileInfo> myFiles = di.GetFiles("*.txt").Where(f => f.Extension == ".txt").ToList(); 
+0

謝謝澄清! – John 2011-04-06 21:57:33

+0

編輯並給了更多的例子。 – 2011-04-06 21:58:48

0

我有一個用戶提供的模式,所以許多其他答案不適合我。我結束了這個更通用的解決方案:

public string[] GetFiles(string path, string pattern) 
{ 
    bool lastWildIsHook = false; 
    if(pattern.EndsWith("?")) 
    { 
     pattern = pattern.Substring(0, pattern.Length - 1); 
     lastWildIsHook = true; 
    } 
    var lastWildIndex = Math.Max(pattern.LastIndexOf("*"), pattern.LastIndexOf("?")); 
    var endsWith = pattern.Length > lastWildIndex ? pattern.Substring(lastWildIndex + 1) : pattern; 
    if(!lastWildIsHook) 
     return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith)).ToArray(); 
    else 
     return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith) || p.Substring(0, p.Length - 1).EndsWith(endsWith)).ToArray(); 
} 
相關問題