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

时间:2011-04-06 21:17:46

标签: c# regex filtering 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")等测试每个文件名字符串,以实现此目的?

谢谢!

8 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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();

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

试试这个:

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

答案 4 :(得分: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);
}

答案 5 :(得分:0)

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

答案 6 :(得分: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);
            }

答案 7 :(得分: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();
}