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

时间:2012-06-09 22:53:01

标签: c# linq

所以我有这个例程:

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。

感谢。

3 个答案:

答案 0 :(得分:13)

我不确定您是否真的想要为该查询使用任务并行库。出于某些原因,请参阅此问题How to find all exe files on disk using C#?

至于按创建日期枚举文件,我会通过使用提供的路径创建新的DirectoryInfo来启动该功能,然后调用.EnumerateFiles(string pattern, SearchOption searchOption)以获取与您的模式匹配的所有文件。最后,您可以通过返回的枚举中的CreationTime对象的FileInfo属性进行排序,然后返回完整的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;
}

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

答案 1 :(得分:2)

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

答案 2 :(得分: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);