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

Ber*_*nDK 20 c# directory file alphabetical-sort

我想从C#获取文件夹中所有文件的列表.很容易:

Directory.GetFiles(folder)
Run Code Online (Sandbox Code Playgroud)

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

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

00000000001.log
00000000002.log
00000000003.log
00000000004.log
..
00000463245.log
00000853221.log
00024323767.log
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*que 36

var files = Directory.EnumerateFiles(folder)
                     .OrderByDescending(filename => filename);
Run Code Online (Sandbox Code Playgroud)

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


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

var lastFile = Directory.EnumerateFiles(folder).MaxBy(filename => filename);
Run Code Online (Sandbox Code Playgroud)

  • @BerggreenDK,不,Directory.GetFiles没有参数来指定顺序.EnumerateFiles会懒惰地生成文件名,因此它们不会一次全部加载到内存中.但是,OrderBy需要在开始排序之前加载所有内容...而是可以使用[MoreLinq](http://code.google.com/p/morelinq/)中定义的MaxBy方法.看到我更新的答案 (2认同)

yas*_*891 16

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

var biggest = files.First();
Run Code Online (Sandbox Code Playgroud)

如果你真的是在最高数字之后并且这些日志文件的名称与你建议的一样,那么:

Directory.GetFiles(folder).Length
Run Code Online (Sandbox Code Playgroud)

  • 如果性能真的那么大(你做基准吗?),你可能应该决定在内存中存储最高数字(即类成员/属性) (3认同)

Ric*_*dle 6

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

int x = 10;
var files = Directory.EnumerateFiles(folder)
                 .OrderByDescending(filename => filename)
                 .Take(x);
Run Code Online (Sandbox Code Playgroud)