如何按名称排序检索目录中的文件列表

21

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

Directory.GetFiles(folder)

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

它们都以前导零命名,例如:

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

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

3个回答

37
var files = Directory.EnumerateFiles(folder)
                     .OrderByDescending(filename => filename);

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


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

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

1
而且一个 ".ToList()" 就完美了 :D - Matías Fidemraizer
1
@Matías Fidemraizer,为什么?这取决于您打算如何处理结果... - Thomas Levesque
@BerggreenDK Directory.GetFiles 返回一个字符串数组(文件名),因此您不需要迭代“files”。 - Matías Fidemraizer
2
@BerggreenDK,不,Directory.GetFiles没有指定顺序的参数。EnumerateFiles会惰性地生成文件名,因此它们不会一次性全部加载到内存中。但是,OrderBy需要在开始排序之前加载所有内容...相反,您可以使用MoreLinq中定义的MaxBy方法。请参阅我的更新答案。 - Thomas Levesque
好的,谢谢大家提供的出色答案和评论!我只是需要确认一下。 - BerggreenDK
显示剩余2条评论

16
var files = from file in Directory.GetFiles(folder)    
               orderby file descending 
               select file;

var biggest = files.First();
如果您真的想要最高的数字,并且这些日志文件的命名方式与您建议的方式相同,那么可以考虑以下方法:
Directory.GetFiles(folder).Length

好的,这看起来像是LINQ语法,据我所知,在选择之前它仍会将整个目录加载到内存中?我正在寻找一个在Directory命令本身上进行“筛选”的方法,因为我们可能有很多文件在同一个目录中,并且这个函数会被频繁调用。 - BerggreenDK
我想知道具有最高编号的文件名称,以便追加更多日志或能够生成下一个编号。因此,“猜测下一个”是其中之一的任务。正如我的问题所述,我不需要所有其他文件的列表。 - BerggreenDK
3
如果性能真的很重要(你进行了基准测试吗?),你可能需要决定将最高数字存储在内存中的某个地方(例如类成员/属性)。 - yas4891
是的,那可能是另一个选项。但我的问题只是:.NET中是否有一个参数可以自动过滤筛选,或者获取文件的反向顺序是否不可能。 - BerggreenDK
是的!决定听取社区的意见。如果出现性能问题,只有在它真正发生时才去处理它!购买更大的服务器/硬盘/控制器。哈哈! - BerggreenDK
显示剩余2条评论

6

延伸 @Thomas 的说法,如果你只需要前 X 个文件,可以这样做:

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

谢谢!那也可以非常有帮助。 - BerggreenDK
我想从文件夹/目录中获取每个文件。我的文件名包含一些ID_documentt_filename.docx,类似于这样的格式。现在,我想将此文件标题与ID拆分并将其存储在表格或内存中。如何实现? - userAZLogicApps
var dir = new DirectoryInfo(@"D:\folder1"); foreach (var singleFile in dir.EnumerateFiles(".", SearchOption.AllDirectories)) { if(singleFile != null && singleFile.Length > 0 ) { - userAZLogicApps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接