c#LINQ:根据文件大小过滤文件列表

时间:2009-09-29 20:00:06

标签: c# linq

我需要一些帮助,使用LINQ根据文件大小提交文件列表。我有一些代码,但它使用file.length而不是FileInfo(文件).length。我不知道如何在表达式中实现对象'FileInfo'。 HELP?

        {            
            IEnumerable<string> result = "*.ini,*.log,*.txt"
            .SelectMany(x => Directory.GetFiles("c:\logs", x, SearchOption.TopDirectoryOnly))
                            ;

            result = result
                .Where(x => (x.Length) > "500000")

               ;

       }

2 个答案:

答案 0 :(得分:4)

你应该可以做这样的事情。

使用DirectoryInfo,GetFiles将返回FileInfo的集合而不是字符串。

new DirectoryInfo(@"c:\logs")
    .GetFiles("*.ini,*.log,*.txt", SearchOption.TopDirectoryOnly)
    .Where(f => f.Length > 500000);

当然,如果你愿意的话,你总是会内联创建FileInfo。

如果你只想要文件名...

IEnumerable<string> results = new DirectoryInfo(@"c:\logs")
    .GetFiles("*.ini,*.log,*.txt", SearchOption.TopDirectoryOnly)
    .Where(f => f.Length > 500000)
    .Select(f => f.FullName);

答案 1 :(得分:2)

对不起。 Searchpattern无法检查多个扩展程序。

看到这篇文章: http://msdn.microsoft.com/en-us/library/aa328752(VS.71,loband).aspx 基本上这些是您的搜索模式工具:

  • “*”零个或多个字符。
  • “?”正好一个字符

遗憾的是,没有像“OR”这样的分隔符。

您应该使用正则表达式模式:

Regex filepattern = new Regex(".log|.txt|.ini");

var test = new DirectoryInfo("C:\\")
    .GetFiles("*", SearchOption.TopDirectoryOnly)
    .Where(f => f.Length > 0 && filepattern.IsMatch(f.FullName));

说明Quintin Robinson正在谈论的内容:

    var dir = new DirectoryInfo("C:\\");
    var test = dir
        .GetFiles("*.txt", SearchOption.TopDirectoryOnly)
        .Concat(dir.GetFiles("*.log", SearchOption.TopDirectoryOnly))
        .Concat(dir.GetFiles("*.ini", SearchOption.TopDirectoryOnly))
        .Where(f => f.Length > 0);

他认为GetFiles经过了大量优化,而且速度更快 - 特别是对于包含大量文件的目录。我没有对它进行基准测试,真的不知道哪个最快:)

这两种方法都有效。我测试了它们并给出了相同的结果