我在一个文件夹中有1000个文件,我想找到该文件的名称,但是当我这样做时 文件名未排序。
例如:这些是我的文件名
1-CustomerApp.txt
2-CustomerApp.txt
3-CustomerApp.txt
...
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;
}
答案 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
但如果我们改变
10a
和2a
,PadLeft
,以及010a
我们看到002a
和0
,字符后面的字符
0
/ 1
=>等于
0
/ 002a
=>首先f-2-a
这个“适用”你的情况,但实际上取决于你的“文件命名”逻辑。
注意:此解决方案不适用于其他文件命名逻辑
例如,数字部分不在开头。
f-10-a
和00-f-2-a
由于
0-f-10-a
仍然会在1-abc
或“非数字部分”的长度不同。
2-z
和01-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);