获取目录文件,按日期排序,该日期是文件名的一部分

时间:2017-03-23 13:10:11

标签: c# linq file directory

我需要从目录中获取所有文件,按照作为文件名称一部分的日期排序:

James_2015.06.27.pdf
Anna_2017.01.17.pdf
Timmy_2017.02.19.pdf

目前,我正在使用此功能,仅按Name对文件进行排序。

 DirectoryInfo info = new DirectoryInfo(path);
 FileInfo[] files = info.GetFiles(filter).OrderBy(p => p.Name).ToArray();

任何想法我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:4)

您需要解析文件名:

DirectoryInfo info = new DirectoryInfo(path);
FileInfo[] files = info.GetFiles(filter)
    .OrderBy(p => Path.GetFileNameWithoutExtension(p.FullName).Split('_')[1])
    .ToArray();

但这很容易出错。

使用linq

就像我说的,这很容易出错,我可能会这样写:

DirectoryInfo info = new DirectoryInfo(path);


FileInfo[] files = (from fileInfo in info.GetFiles(filter)
                    let splitted = Path.GetFileNameWithoutExtension(fileInfo.FullName).Split('_')
                    where splitted.Length > 1
                    orderby splitted[1]
                    select fileInfo).ToArray();

更好的方法是解析日期时间并对其进行排序。

这也将过滤文件名中没有有效日期的文件。

private DateTime? ParseFilename(FileInfo fileInfo)
{
    var parts = Path.GetFileNameWithoutExtension(fileInfo.FullName).Split('_');
    if (parts.Length < 1)
        return null;

    DateTime result;

    if (!DateTime.TryParse(parts[1], out result))
        return null;

    return result;
}

用法:

DirectoryInfo info = new DirectoryInfo(path);

FileInfo[] files = (from fileInfo in info.GetFiles(filter)
                    let DateTime = ParseFilename(fileInfo)
                    where DateTime.HasValue
                    orderby DateTime.Value
                    select fileInfo).ToArray();

答案 1 :(得分:1)

这应该适合你:

DirectoryInfo info = new DirectoryInfo(path);
FileInfo[] files = info.GetFiles(filter).OrderBy(p => Path.GetFileNameWithoutExtension(p.Name).Split('_').Last()).ToArray();

答案 2 :(得分:0)

我会创建一个文件名为Key的字典,值将是文件名中的子字符串,只包含日期。

你可以遍历你的DirectoryEntrys并将它们循环添加到字典中,算法将是这样的:

                        string filename1 = "asbdahszd2018.02.01.pdf";
                        string filename2 = "foobar2018.02.01.pdf";

                        Dictionary<string, string> myDict = new Dictionary<string,string>();

                        myDict.Add(filename1, filename1.Substring(filename1.Length - 14, 10));
                        myDict.Add(filename2, filename2.Substring(filename2.Length - 14, 10));

                        myDict.OrderBy(item => item.Value);