分别读取文件名?

时间:2013-12-18 08:14:41

标签: c#

我在一个文件夹中有1000个文件,我想找到该文件的名称,但是当我这样做时 文件名未排序。

例如:这些是我的文件名

1-CustomerApp.txt
2-CustomerApp.txt
3-CustomerApp.txt
...

screenshot

var adddress = @"data\"; 
str = "";
DirectoryInfo d = new DirectoryInfo(adddress);//Assuming Test is your Folder
FileInfo[] Files = d.GetFiles("*.txt"); //Getting Text files
foreach (FileInfo file in Files)
{
    str = str + ", " + file.Name;
}

4 个答案:

答案 0 :(得分:8)

您可以使用它来保持“数字”顺序

FileInfo[] files = d.GetFiles("*.txt")
.OrderBy(m => m.Name.PadLeft(200, '0')).ToArray();
当然,

200是非常武断的。

这将添加“尽可能多的0”,以便文件名+ n 0是一个长度为200的字符串。

让它变得不那么随意和“脆弱”,你可以做到

var f = d.GetFiles("*.txt");
var maxLength = f.Select(l => l.Name.Length).Max() + 1;
FileInfo[] files = f.OrderBy(m => m.Name.PadLeft(maxLength, '0')).ToArray();

它是如何运作的(糟糕的解释,有人可以做得更好)以及为什么它远非完美

c#中字符的排序将数字字符放在字母字符之前。 因此0(或9)将在a之前。 但是10a将在2a之前1之前2

查看char之后的char

1 / 2 =>首先10a

但如果我们改变 10a2aPadLeft,以及010a 我们看到002a0,字符后面的字符

0 / 1 =>等于

0 / 002a =>首先f-2-a

这个“适用”你的情况,但实际上取决于你的“文件命名”逻辑。

注意:此解决方案不适用于其他文件命名逻辑

例如,数字部分不在开头。

f-10-a00-f-2-a

由于

0-f-10-a仍然会在1-abc

之前

或“非数字部分”的长度不同。

2-z01-abc

由于 0002-z将在{{1}}

之后出现

答案 1 :(得分:0)

它们按字母顺序排序。我不知道你怎么看他们没有排序的东西(你比较的东西或你在哪里看到不同的结果),如果你使用的是文件管理器,那么也许它应用自己的排序。在Windows资源管理器中,结果将是相同的(尝试按名称列排序)。

如果你知道如何创建文件名的模板,那么你可以做一个技巧,应用自己的排序。在你的例子的情况下,在开始时提取数字(直到减去)并用零填充它(直到最大可能的数字大小),然后对你得到的数据进行排序。

或者您可以在创建文件时使用零填充:

0001-CustomerApp.txt
0002-CustomerApp.txt
...
9999-CustomerApp.txt

答案 2 :(得分:0)

尝试alphanumeric-sorting并根据它对文件的名称进行排序。

FileInfo[] files = d.GetFiles("*.txt");
files.OrderBy(file=>file.Name, new AlphanumComparatorFast())

答案 3 :(得分:0)

这应该会给你或多或少的你想要的东西;它跳过任何字符,直到它到达一个数字,然后包括所有直接跟随数字字符以获得数字。然后将该数字用作排序的密钥。或许有点乱,但应该工作(并且比其他选项更不易碎,因为这会明确搜索文件名中的第一个“整数”):

var filename1 = "10-file.txt";
var filename2 = "2-file.txt";

var filenames = new []{filename1, filename2};

var sorted = 
    filenames.Select(fn => new { 
                                  nr = int.Parse(new string(
                                             fn.SkipWhile(c => !Char.IsNumber(c))
                                               .TakeWhile(c => Char.IsNumber(c))
                                               .ToArray())), 
                                  name = fn
                                })
              .OrderBy(file => file.nr)
              .Select(file => file.name);