【问题标题】:How to retrieve list of files in directory, sorted by name如何检索目录中的文件列表,按名称排序
【发布时间】:2011-10-20 20:43:55
【问题描述】:

我正在尝试从 C# 获取文件夹中所有文件的列表。很简单:

Directory.GetFiles(folder)

但我需要将结果按字母顺序倒序排列,因为它们都是数字并且我需要知道目录中的最高数字。当然我可以将它们抓取到一个数组/列表对象中,然后进行排序,但我想知道是否有一些过滤器/参数代替?

它们都以前导零命名。喜欢:

00000000001.log
00000000002.log
00000000003.log
00000000004.log
..
00000463245.log
00000853221.log
00024323767.log

最简单的方法是什么?我不需要获取其他文件,只需获取“最大/最新”数字即可。

【问题讨论】:

    标签: c# file directory alphabetical-sort


    【解决方案1】:
    var files = Directory.EnumerateFiles(folder)
                         .OrderByDescending(filename => filename);
    

    EnumerateFiles 方法是 .NET 4 中的新方法,如果您使用的是早期版本,您仍然可以使用 GetFiles


    编辑:实际上你不需要对文件名进行排序,如果你使用MoreLinq中定义的MaxBy方法:

    var lastFile = Directory.EnumerateFiles(folder).MaxBy(filename => filename);
    

    【讨论】:

    • 和一个“.ToList()”将是完美的:D
    • @Matías Fidemraizer,为什么?这取决于您打算如何处理结果...
    • 对 .NET4 很感兴趣(我认为我们运行 3.5),但我猜与@yas4891 的问题相同?在 LINQ 语法选择正确的项目之前,每个文件名都被拉入内存。我正在寻找 Directory 对象的简单参数?这可能吗?
    • @Thomas 因为您知道这适用于延迟执行,并且由于这是一个示例,而且问题的作者可能不是 LINQ 专家,所以这似乎应该避免给他带来问题。
    • @BerggreenDK,不,Directory.GetFiles 没有参数来指定顺序。 EnumerateFiles 会延迟生成文件名,因此它们不会一次全部加载到内存中。但是,OrderBy 需要在开始排序之前加载所有内容......相反,您可以使用MoreLinq 中定义的 MaxBy 方法。查看我的更新答案
    【解决方案2】:
    var files = from file in Directory.GetFiles(folder)    
                   orderby file descending 
                   select file;
    
    var biggest = files.First();
    

    如果您真的在追求最高数字并且这些日志文件的命名方式与您建议的一样,那么:

    Directory.GetFiles(folder).Length
    

    【讨论】:

    • 好的,这看起来像 LINQ 语法,据我了解,它仍然会在选择之前将整个目录拉入内存?我正在目录命令本身上搜索“过滤器”,因为我们可能在同一目录中有相当多的文件,并且此函数将被调用很多。
    • 嗯。您如何进一步澄清您的帖子并告诉我们您最终想要实现的目标?似乎您正试图“猜测”某些命名方案中的下一个有效整数 - 对吧?
    • 我想知道编号最大的文件的名称,以便附加更多日志或能够生成下一个编号。所以是的,“猜测下一个”是其中一项任务。正如我的问题所指出的那样,我不需要所有其他人的名单。
    • 如果性能真的很重要(您是否进行了基准测试?),您可能应该决定将最高数字存储在内存中的某个位置(即类成员/属性)
    • 是的,这可能是另一种选择。但我的问题只是:.NET 中是否有一个参数可以自动进行过滤,或者是否可以获得文件的相反顺序。
    【解决方案3】:

    扩展@Thomas 所说的,如果你只需要top X 文件,你可以这样做:

    int x = 10;
    var files = Directory.EnumerateFiles(folder)
                     .OrderByDescending(filename => filename)
                     .Take(x);
    

    【讨论】:

    • 谢谢!这也很有帮助。
    • 我想从文件夹/目录中获取每个文件。我的文件名包含一些 ID _documentt_filename.docx,有点像。现在,我想用 ID 拆分这个文件标题并将它存储在一个表中或在记忆中。如何做到这一点?
    • var dir = new DirectoryInfo(@"D:\folder1"); foreach (var singleFile in dir.EnumerateFiles(".", SearchOption.AllDirectories)) { if(singleFile != null && singleFile.Length > 0 ) {
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2021-05-17
    • 2020-12-15
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多