2017-03-23 87 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();