【问题标题】:c# LINQ: Filter List of Files based on File Sizec# LINQ:根据文件大小过滤文件列表
【发布时间】:2009-09-29 20:00:06
【问题描述】:

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

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

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

               ;

       }

【问题讨论】:

    标签: c# linq


    【解决方案1】:

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

    使用 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);
    

    【讨论】:

    • 我认为您的搜索模式有问题 :)
    • @Zion,很高兴它对你有用! @CasperT,我没有运行代码,只是使用了为模式提供的示例代码,而不是 100% 是否准确。
    • 看这个链接:msdn.microsoft.com/en-us/library/aa328752(VS.71,loband).aspx在“备注”下。在大多数情况下,您只能为一个扩展应用搜索模式
    【解决方案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 已经过高度优化,而且速度会更快——尤其是对于包含大量文件的目录。我没有对其进行基准测试,真的不知道哪个最快:)

    这两种方法都有效。我已经对它们进行了测试,它们给出了相同的结果

    【讨论】:

    • 您还可以连接对 GetFiles 的调用结果,而不必为每个文件执行正则表达式匹配。我想相信对 GetFiles 调用的过滤已经过优化,尽管我不能肯定地说。
    • 我不知道该怎么做 :)
    • 但是无论如何,不​​是每个文件都以一种或另一种方式与一种模式进行比较吗?
    • 对于 Concat,您可以按照保留目录信息实例的方式做一些事情,然后 var foundItems = info.GetFiles(filter1).Concat(info.GetFiles(filter2))... 等(显然是伪的)。无论如何,它必须进行一些过滤,这就是为什么我说我不确定差异,但我想 GetFiles 依赖于一些本机优化例程。
    • 我认为您应该将其表述为“在这里给我一块该死的骨头!”。虽然我还是给你 +1 了。
    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多