使用 LINQ 排序以查找最旧的文件时从列表中过滤文件夹

问题描述

我目前正在使用下面的代码获取给定路径中最旧的文件。最近在该路径中创建了一个文件夹,该文件夹很快成为最旧的“文件”。如何修改 linq 以过滤目录并仅报告文件

var fileInfo = new DirectoryInfo(path).GetFileSystemInfos();
var oldestFile = fileInfo.OrderBy(fi => fi.CreationTime).FirstOrDefault();

解决方法

您只能查找如下文件:

var oldestFile = fileInfo.Where(fi => fi is FileInfo)
                         .OrderBy(fi => fi.CreationTime)
                         .FirstOrDefault();

方法 GetFileSystemInfos 返回一个 System.IO.FileSystemInfo 对象数组。这个类是FileInfoDirectoryInfo对象的基类,请看here。正如上一个链接中提到的:

FileSystemInfo 对象可以表示文件或目录, 从而作为 FileInfoDirectoryInfo 对象

的基础

所以通过传递谓词

fi => fi is FileInfo

对于上面的 Where 方法,您只能获得代表文件的对象。

,

GetFileSystemInfos 将显示所有文件和目录。如果您只想过滤文件,您可以使用 GetFiles 而不是 GetFileSystemInfos

示例:

    var fileInfo = new DirectoryInfo(path).GetFiles();
    var oldestFile = fileInfo.OrderBy(fi => fi.CreationTime).FirstOrDefault();

注意: GetFiles 的性能比 GetFileSystemInfos 好,因为它不会加载内存中的所有文件和文件夹。 因此,如果您只想过滤文件,最好使用 GetFiles 而不是 GetFileSystemInfos