【问题标题】:Order (and enumerate) directory listing by file creation date?按文件创建日期排序(并枚举)目录列表?
【发布时间】:2021-06-22 20:10:53
【问题描述】:

所以我有这个例程:

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。

谢谢。

【问题讨论】:

  • 请简化/集中问题。是关于“枚举”还是“排序”的问题?
  • @pst 枚举按创建日期排序的文件

标签: c# linq


【解决方案1】:

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

至于按创建日期枚举文件,我将通过使用提供的路径创建一个新的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;
}

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

【讨论】:

  • 必须包含using System.Linq;
  • searchOption 参数,函数中的searchOptions,serachPattern 不喜欢数组
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    以下示例:

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

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 2021-11-03
      • 2019-08-15
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 2011-12-20
      • 1970-01-01
      相关资源
      最近更新 更多