按文件名的内容对文件进行排序

时间:2010-12-01 21:25:18

标签: c# .net visual-studio sorting

我有一个我想根据日期排序的文件列表。需要注意的是,列表中的每个文件都包含日期作为文件名的一部分,我想根据此日期对文件进行排序。原因是因为文件名字符串中的日期与文件中的内容相关,即每当文件被移动时,每个文件的实际日期属性,创建,修改,访问日期等都会发生变化。或修改,所以我不能依靠它为我的目的。我正在创建一个自定义比较器以在列表排序方法中使用,但我想看看是否有任何其他更好或独特的方法。提前谢谢。

更新:

在回答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);
    }
}

3 个答案:

答案 0 :(得分:2)

我会说自定义比较器是要走的路。只需使用正则表达式提取日期部分,然后从中创建一个DateTime并进行比较。

答案 1 :(得分:1)

您可以使用OrderBy扩展方法并指定要排序的值。例如:

list = list.OrderBy(f => DateTime.Parse(Path.GetFileName(f.Name))).ToList();

答案 2 :(得分:1)

我曾经在一个生成带日期和文件的文件的系统上工作。时间编码到文件名中。日期格式符合旧的DOS 8.2文件名格式。

由于在文件系统中列出文件时的命名约定,它们自然地被正确排序。如果你有这么多的控​​制权,你可以考虑这样做。即命名为YYYYMMDD ...将默认按日期排序。

无需额外代码。