所以我有这个例程:
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。
感谢。
答案 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);