9

所以我有这个例程:

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>();
}

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

谢谢。

4

3 回答 3

16

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

至于按创建日期枚举文件,我将通过使用提供的路径创建一个新的DirectoryInfo来启动该函数,然后调用.EnumerateFiles(string pattern, SearchOption searchOption)以获取与您的模式匹配的所有文件。最后,您可以在返回的枚举中按FileInfo对象的CreationTime属性排序,然后返回完整的 FileInfo 对象或仅返回它们的Name,如下所示:

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;
}

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

于 2012-06-10T00:55:47.013 回答
3

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

于 2012-06-09T22:57:06.033 回答
0

以下示例:

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);
于 2021-06-22T12:10:53.333 回答