使用LINQ无需时间即可获取最后编写的文件

时间:2014-06-25 10:17:21

标签: c# linq

我有一个包含198个文件的文件夹,其中有25个文件的最后写入日期为06.22.2014。我正在尝试使用以下代码获取这组最后修改过的文件:

public static IEnumerable<FileInfo> GetLatestFiles(string path)
{
    return new DirectoryInfo(path)
            .GetFiles("*.log")
            .GroupBy(f => f.Extension)
            .Select(g => g.OrderByDescending(f => f.LastWriteTime
            .Date
            .ToShortDateString())
            .First());
}

然而,它只返回一个文件,因为它检查上次修改,尽管我裁剪了日期。有没有办法枚举这个文件列表,不包括时间?

3 个答案:

答案 0 :(得分:2)

如果您不仅仅在点上对齐,而是在顶层调用上,则更容易分辨您正在做什么:

public static IEnumerable<FileInfo> GetLatestFiles(string path)
{
    return new DirectoryInfo(path)
            .GetFiles("*.log")
            .GroupBy(f => f.Extension)
            .Select(g => g.OrderByDescending(f => f.LastWriteTime
                                                   .Date
                                                   .ToShortDateString())
                          .First());
}

现在,您正在进行基于字符串的排序。除非你恰好处于将年份放在第一位,然后是月份,然后是白天的文化中,这几乎肯定不是你想要的。您可能根本不关心字符串表示。 除非您真的对文字表示感兴趣,否则请始终避免转换为字符串。

接下来,你做了几件奇怪的事情:

  • 您只提取“* .log”文件,但是您按扩展程序进行分组
  • 您只是在订购后获得每组最多的第一个结果

我怀疑你真的想按 date 进行分组,并返回最近一组中的所有内容。例如:

public static IEnumerable<FileInfo> GetLatestFiles(string path)
{
    return new DirectoryInfo(path)
            .GetFiles("*.log")
            .GroupBy(f => f.LastWriteTime.Date)
            .OrderByDescending(g => g.Key) // Order the groups by date (desc)
            .First(); // Just return the most recent group
}

(请注意,如果目录中没有文件,这将失败...在这种情况下,您希望它做什么?)

您还应该考虑您感兴趣的时区 - 两个文件在一个时区中可能具有相同的上次修改日期,但在另一个时区中没有...

答案 1 :(得分:0)

最后使用First()是合理的,您只能获得一个文件。如果您将其删除,您将按照已经完成的顺序排列所有文件。

但是,使用已构建的查询,您将无法获得所需的查询。而不是这样,您可以尝试以下内容:

 DirectoryInfo(path).GetFiles("*.log")
                    .Where(x=>x.LastWriteTime.ToShortDateString()=="06/22/2014");

答案 2 :(得分:-1)

尝试取消First()

public static IEnumerable<FileInfo> GetLatestFiles(string path)
{
    return new DirectoryInfo(path)
            .GetFiles("*.log")
            .GroupBy(f => f.Extension)
            .Select(g => g.OrderByDescending(f => f.LastWriteTime
            .Date
            .ToShortDateString()));
}