按文件创建日期对目录列表进行排序(和枚举)

本文关键字:排序 枚举 列表 创建日期 文件 | 更新日期: 2023-09-27 18:36:37

所以我有这个例程:

public static IEnumerable<string> GetFiles( string path, string[] searchPatterns, SearchOption searchOption = SearchOption.TopDirectoryOnly) {
    return searchPatterns.AsParallel()
                         .SelectMany(searchPattern => 
                             Directory.EnumerateFiles(path, searchPattern, searchOption))
                         .OrderBy<string, string>( (f) => f)
                         .Distinct<string>();
}

和它的工作,但按其名称对文件进行排序,我需要对其创建日期返回的文件进行排序。如果项目是例程中的字符串,我该如何按该排序。我想使用枚举原因文件预计超过 1k。

谢谢。

按文件创建日期对目录列表进行排序(和枚举)

我不确定您是否真的想使用任务并行库进行该查询。 出于某些原因,请参阅此问题如何使用 C# 查找磁盘上的所有 exe 文件?。

至于按创建日期枚举文件,我将通过使用提供的路径创建新的 DirectoryInfo 来启动该函数,然后调用 .枚举文件(字符串模式,搜索选项搜索选项)以获取与您的模式匹配的所有文件。 最后,您可以按返回的枚举中 FileInfo 对象的 CreationTime 属性进行排序,然后返回完整的 FileInfo 对象,或仅返回其名称,如下所示:

public static IEnumerable<string> GetFiles( string path, string[] searchPatterns, SearchOption searchOption = SearchOption.TopDirectoryOnly) {
    DirectoryInfo dir = new DirectoryInfo(path);
    var dirs = (from file in dir.EnumerateFiles(searchPatterns, searchOptions)
            orderby file.CreationTime ascending
            select file.Name).Distinct(); // Don't need <string> here, since it's implied
    return dirs;
}

注意:我目前无法访问编译器,但我相信上面的代码没有错误。

您需要

切换到使用 DirectoryInfo.EnumerateFiles,这将返回 FileInfo 实例的集合。 然后,您可以按日期对它们进行排序并选择名称。

以下示例:

DirectoryInfo dir = new DirectoryInfo(path);
//Date created latest first
var files = dir.EnumerateFiles().OrderByDescending(x => x.CreationTime);
//Date created latest last
var files2 = dir.EnumerateFiles().OrderBy(x => x.CreationTime);
//dir.EnumerateFiles() is the same as the ones below
var files3 = dir.EnumerateFiles("*");
var files4 = dir.EnumerateFiles("*", SearchOption.TopDirectoryOnly);