我有一个包含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());
}
然而,它只返回一个文件,因为它检查上次修改,尽管我裁剪了日期。有没有办法枚举这个文件列表,不包括时间?
答案 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());
}
现在,您正在进行基于字符串的排序。除非你恰好处于将年份放在第一位,然后是月份,然后是白天的文化中,这几乎肯定不是你想要的。您可能根本不关心字符串表示。 除非您真的对文字表示感兴趣,否则请始终避免转换为字符串。
接下来,你做了几件奇怪的事情:
我怀疑你真的想按 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()));
}