C# 是否按特定顺序对文件夹中的文件进行迭代?
我对c编程非常陌生,所以如果我的问题很琐碎,我道歉。 我正在运行一些c代码,需要迭代文件夹中的一些文件,并使用:C# 是否按特定顺序对文件夹中的文件进行迭代?,c#,loops,C#,Loops,我对c编程非常陌生,所以如果我的问题很琐碎,我道歉。 我正在运行一些c代码,需要迭代文件夹中的一些文件,并使用: foreach (string f in Directory.GetFiles(@"C:\temp\GeneralStats")) { 但是,我希望这些文件按照文件名的特定顺序读取。我的文件名的格式如下 generalstats_2012_11_1.csv generalstats_2012_11_2.csv generalstats_2012_11_3.csv ..... 当我的
foreach (string f in Directory.GetFiles(@"C:\temp\GeneralStats"))
{
但是,我希望这些文件按照文件名的特定顺序读取。我的文件名的格式如下
generalstats_2012_11_1.csv
generalstats_2012_11_2.csv
generalstats_2012_11_3.csv
.....
当我的代码读取文件时,它以generalstats_2012_11_1.csv开始,然后直接跳到generalstats_2012_11_10.csv,而不是generalstats_2012_11_2.csv
我试着在网上搜索答案,但没有找到任何答案。当然,我是根据特定文件夹中名称中的日期来订购文件的,但代码根本不承认这一点。
有人能帮我吗?c中是否有我遗漏的订单函数?您可以使用以下命令:
var paths = Directory.GetFiles(@"C:\temp\GeneralStats")
.OrderBy(path =>
Convert.ToInt32(path.Split('_', '.')[1]) * 10000 +
Convert.ToInt32(path.Split('_', '.')[2]) * 100 +
Convert.ToInt32(path.Split('_', '.')[3]));
foreach (string path in paths)
{
}
这将从文件名中获取日期部分,并从中创建一个整数,例如,文件名中的2012_11_10为2012110为整数,2012_11_1为20121101等。这些数字用于排序
上述方法的另一个变化是:
var paths = Directory.GetFiles(@"C:\temp\GeneralStats")
.OrderBy(path =>
Convert.ToInt32(
String.Concat(
path.Split('_', '.')
.Skip(1)
.Take(3)
.Select(num => num.PadLeft(2, '0'))
.ToArray())
)
);
它还解析文件名中的数字,并创建用于排序的整数
您可以使用Directory.GetFiles方法来代替Directory.GetFiles方法,但这仅在.NET 4及更高版本中可用。如果要按文件名后面的日期排序,则必须将其强制转换为1,否则顺序为字母顺序,因此10在2之前 您可以在此linq查询中使用Enumerable.OrderBy:
var files = Directory.EnumerateFiles(@"C:\temp\GeneralStats", "*.csv")
.Select(fn => new
{
Path = fn,
Split = Path.GetFileNameWithoutExtension(fn).Split('_')
})
.Where(x => x.Split.Length == 4)
.Select(x => new
{
x.Path,
Date = new DateTime(int.Parse(x.Split[1]), int.Parse(x.Split[2]), int.Parse(x.Split[3]))
})
.OrderBy(x => x.Date)
.Select(x => x.Path);
首先,我从Path类中选择一个匿名类型,它具有一些有用的属性,比如GetFileNameWithoutExtension。这将使查询的其余部分更高效、更可读。Where用于防止文件名中没有日期部分的文件出错。下一个select从string.Split派生的标记中解析日期时间。最后三部分包含年、月和日。订购人将按日期订购。最后,我再次选择完整路径,因为您最初希望对文件进行排序
您可以使用foreach枚举结果,如果要持久化,可以使用例如ToList:
foreach (string f in files)
{
// ...
}
搜索人工排序或自然排序顺序使用两位数表示月份和天数!或者在实现可能的副本时享受乐趣。这个问题不是很好,但最重要的答案应该是一个解决方案-它基本上显示了如何使用与Windows相同的底层功能对文件进行排序。以YMD顺序写入日期,然后使用单个数字表示日期,这似乎有点奇怪。。。我会修正这个问题,而不是胡乱摆弄自然排序顺序。@LeneJungKjær-这就是Ivan答案旁边的勾选选项的目的-这样你就可以表明你的问题得到了回答。第二个想法是否正确处理了2012_1_11和2012_11_1?@KierenJohnstone,我不认为是这样的,这就是我删除它的原因:谢谢你注意到它。它工作得很好-非常感谢你,我很感激伊万G@LeneJungKjær太好了,我很高兴它有帮助:我用PadLeft2修复了第二个版本的排序,“0”在一位数的月份或天数前加上“0”的年份不受影响。谢谢,我真的很感激-我不能很好地解决这个问题,但下面来自Ivan G的答案为我解决了它。@LeneJungKjær:也许你在.NET 3.5上,EnumerateFiles需要.NET framework 4,然后简单地用GetFiles替换它,GetFiles首先将所有文件读入内存。其余的也适用于3.5。好的,谢谢@TimSchmelter的信息,谢谢你的帮助。