我有一个我想根据日期排序的文件列表。需要注意的是,列表中的每个文件都包含日期作为文件名的一部分,我想根据此日期对文件进行排序。原因是因为文件名字符串中的日期与文件中的内容相关,即每当文件被移动时,每个文件的实际日期属性,创建,修改,访问日期等都会发生变化。或修改,所以我不能依靠它为我的目的。我正在创建一个自定义比较器以在列表排序方法中使用,但我想看看是否有任何其他更好或独特的方法。提前谢谢。
更新:
在回答Saeed的评论时,文件名遵循以下格式:
{Test Name}_{YYYYMMDD}_{HHmmSS}.txt
YYYYMMDD和HHmmSS分别是日期和时间。
更新2:
好的,我写了一个比较器,似乎做得很好,这就是它可以帮助其他人;改变它以搜索文件名中的任何其他元素不需要花费太多精力,只需要更改正则表达式即可。感谢大家的建议,欢迎建设性的批评。
public class TDRDateTimeComparer : IComparer<FileInfo>
{
public int Compare(FileInfo x, FileInfo y)
{
//Return if both strings are null or empty
if (string.IsNullOrEmpty(x.Name) && string.IsNullOrEmpty(y.Name))
{
return 0;
}
Regex rDateTime = new Regex(@"(19|20|21)\d\d(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])_([0-1]\d|2[0-3])([0-5]\d)([0-5]\d)");
/* NOTE: File names will already have been validated at this point, so no need to validate the date/time again.*/
string date1 = rDateTime.Match(x.Name).Value, date2 = rDateTime.Match(y.Name).Value;
DateTime d1 = DateTime.ParseExact(date1, "yyyyMMdd_HHmmss", null), d2 = DateTime.ParseExact(date2, "yyyyMMdd_HHmmss", null);
return d1.CompareTo(d2);
}
}
答案 0 :(得分:2)
我会说自定义比较器是要走的路。只需使用正则表达式提取日期部分,然后从中创建一个DateTime并进行比较。
答案 1 :(得分:1)
您可以使用OrderBy
扩展方法并指定要排序的值。例如:
list = list.OrderBy(f => DateTime.Parse(Path.GetFileName(f.Name))).ToList();
答案 2 :(得分:1)
我曾经在一个生成带日期和文件的文件的系统上工作。时间编码到文件名中。日期格式符合旧的DOS 8.2文件名格式。
由于在文件系统中列出文件时的命名约定,它们自然地被正确排序。如果你有这么多的控制权,你可以考虑这样做。即命名为YYYYMMDD ...将默认按日期排序。
无需额外代码。