以数字方式订购特定文件夹中的文件

时间:2019-05-28 21:48:35

标签: c# file

我有一个仅包含.txt文件的文件夹。我希望我的输出具有一定顺序。

每个文件名的前两位数字是其唯一ID。我想按顺序对文件进行数字排序

我研究了多个类似的问题 Getting all file names from a folder using C#

,但是没有一个因素帮助我实现了这一目标。获得所需输出的最简单方法是什么?

        string folder = @"C:\Testing\";
        var txtFiles = Directory.GetFiles(folder, "*.txt")
                                 .Select(Path.GetFileName)
                                 .ToList();
        foreach(var f in txtFiles)
        {
            Console.WriteLine(f);
        }
        Console.ReadKey();

Windows Explore

enter image description here

控制台输出

Output file

4 个答案:

答案 0 :(得分:2)

这会在第一个数字部分填充零以进行排序:

string folder = @"C:\Testing";
var txtFiles = Directory.GetFiles(folder, "*.txt")
                        .Select(Path.GetFileName)
                        .OrderBy(f => f.Split('_')[0].PadLeft(5, '0'));

foreach (var f in txtFiles)
{
    Console.WriteLine(f); 
}

答案 1 :(得分:1)

您可以只使用OrderBy linq语句并解析出文件名以获得所需的内容。另外,如果您只需要一个简单的列表(例如ToList()),就不需要IEnumerable

例如:

var txtFiles = Directory.EnumerateFiles(folder, "*.txt")
                         .Select(Path.GetFileName)
                         .OrderBy(file =>
                         {
                             string[] nameParts = file.Split('_');
                             if (nameParts.Length > 0)
                             {
                                 int sortValue;
                                 if (int.TryParse(nameParts[0], out sortValue))
                                 {
                                     return sortValue;
                                 }
                             }
                             return 0;
                         });

答案 2 :(得分:1)

更容易的替代方法是使用padding:

var txtFiles = Directory.EnumerateFiles(folder, "*.txt")
                        .Select(Path.GetFileName)
                        .OrderBy(s => s.PadLeft(11));

答案 3 :(得分:-1)

如果需要,可以对其进行更好的排序。使用.OrderBy扩展方法。

string folder = @"C:\Testing\";
var txtFiles = Directory.GetFiles(folder, "*.txt")
               .Select(Path.GetFileName)
               .OrderBy(x => x)
               .ToList();
foreach (var f in txtFiles)
{
 Console.WriteLine(f);
}
Console.ReadKey();