精确的文件扩展名与GetFiles()匹配?

我想检索一个扩展名与指定字符串完全匹配的文件列表。

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

我得到扩展名为*.txt的文件,但我也得到扩展名为*.txtx文件,所以我编码的内容相当于获取扩展名 txt 开头的文件。

这不是我想要的。 我是否需要获取所有文件名并将正则表达式匹配到"\\.txt$" (我认为),或者使用.EndsWith(".txt")等测试每个文件名字符串来完成此操作?

谢谢!

某种解决方法,但您可以使用Where extesion方法过滤掉完全匹配:

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

请注意,这将使扩展名不区分大小写。

使用列表的AddRangefunction而不是执行foreach循环,并为下面的表达式返回的每个项目调用Add(我保存到变量列表中)。

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

我假设你只是向我们展示了你的代码片段,myFiles已经有了它的值,如果没有,你可以做。

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

正则表达式可能有点矫枉过正。 使用FileInfo上的扩展名。

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

试试这个:

 DirectoryInfo di = new DirectoryInfo(someValidPath); List myFiles = ( from file in di.GetFiles("*.txt") where file.Extension == ".txt" select file ).ToList(); 
 DirectoryInfo di = new DirectoryInfo(someValidPath); List myFiles = new List(); foreach (FileInfo fi in di.GetFiles("*.txt")) { if (fi.Extension == ".txt") myFiles.Add(fi); } 

你不能只添加一个if并检查文件名的最后四个字符吗?

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

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

我有一个用户提供的模式,所以许多其他答案不适合我。 我最终得到了这个更通用的解决方案:

 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(); }