2017-03-23 53 views
0

我需要从一个目录下的所有文件,由这是目前的日期排序的一部分日期排序,作为文件名称的一部分:获取目录中的文件,由作为文件名

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(); 

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

回答

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(); 
+0

不适代码:无法转换的FileInfo为String –

+0

在:'路径.GetFileNameWithoutExtension(p)' –

+0

@KobyDouek已更新 –

0

我会用Filename作为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); 
+0

请解释一下,这是非常不清楚 –

1

这应该为你工作:

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