8

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

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")来完成此操作?

谢谢!

4

8 回答 8

4

有点解决方法,但您可以使用Whereextesion 方法过滤掉完全匹配:

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

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

于 2011-04-06T21:25:27.060 回答
3

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

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();
于 2011-04-06T21:51:54.520 回答
2

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

foreach (FileInfo fi in di.GetFiles("*.txt").Where(f => f.Extension == ".txt"))
{
     myFiles.Add(fi);
} 
于 2011-04-06T21:23:42.210 回答
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);
}
于 2011-04-06T21:26:01.410 回答
1

尝试这个:

DirectoryInfo di = new DirectoryInfo(someValidPath); 
List<FileInfo> myFiles =  
    (
        from file in di.GetFiles("*.txt")
        where file.Extension == ".txt"
        select file
    ).ToList();
于 2011-04-06T21:22:31.603 回答
0

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

于 2011-04-06T21:27:26.593 回答
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);
            }
于 2011-04-06T21:44:57.623 回答
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();
}
于 2013-11-21T19:40:02.753 回答