2014-01-15 50 views
1

我試圖編譯文件名列表(帶有「stat」和「kill」文件擴展名),其中文件應該根據創建日期在列表中排序。我試過使用LINQ OrderBy子句,但無法指定日期。這是我目前的邏輯:獲取基於創建日期的文件列表

var fileList = Directory.EnumerateFiles(userPath, "*.*", SearchOption.TopDirectoryOnly).Where(s => s.EndsWith(".stat", StringComparison.InvariantCultureIgnoreCase) || s.EndsWith(".kill", StringComparison.InvariantCultureIgnoreCase)); 

我該如何對它們進行排序?

回答

2

使用DirectoryInfo代替 - 它返回FileInfo對象具有CREATIONTIME財產的順序:

DirectoryInfo dir = new DirectoryInfo(userPath); 
var fileList = dir.EnumerateFiles("*.*", SearchOption.TopDirectoryOnly) 
        .Where(f => f.Extension.Equals(".stat", StringComparison.InvariantCultureIgnoreCase) || 
           f.Extension.Equals(".kill", StringComparison.InvariantCultureIgnoreCase)) 
        .OrderBy(f => f.CreationTime); 

您也可以使用Extension屬性來獲取文件擴展名。

+0

'CreationDate'似乎不存在 - 我需要導入一些東西嗎? –

+0

@DotNET對不起,它應該是[CreationTime](http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.creationtime(v = vs.110).aspx) –

+1

謝謝,我'試試吧! –

2

您可以在Enumerable.OrderBy中使用File.GetCreationTime。您還可以使用Path類:

var fileList = Directory.EnumerateFiles(userPath, "*.*", SearchOption.TopDirectoryOnly) 
    .Select(p => new { Path = p, Extension = Path.GetExtension(p) }) 
    .Where(x => x.Extension.Equals(".stat", StringComparison.InvariantCultureIgnoreCase) || x.Extension.Equals(".kill", StringComparison.InvariantCultureIgnoreCase)) 
    .OrderBy(x => File.GetCreationTime(x.Path)) 
    .Select(x => x.Path); 
+0

謝謝,我已經測試過它,並證明它可以工作。不過,我覺得其他的答案是更優雅,因此我選擇了採用:)感謝您的幫助,+1! –

+1

@DotNET:請注意'DirectoryInfo.GetFiles'效率較低,因爲每個'FileInfo'對象必須初始化爲所有屬性,如'Length',而Directory.GetFiles'只返回路徑。只要我可以,我會使用靜態的「目錄/文件」方法。所以你可以在應用過濾器之後創建'FileInfo'對象**,所以在'Where'之後。但是,如果您只有一個文件夾中只有少量文件,那就是微型優化。 –

+0

@TimSchmelter基本上我同意你的看法,特別是當你只需要獲取一個關於文件的信息。當你不得不請求文件的多個屬性時,FileInfo可以避免額外的安全檢查。但是如果性能是一個真正的目標,那麼我會在這裏連接兩個查詢 - 一個獲得'* .stat *'文件和一個獲取'* .kill *'文件。正如你所建議的那樣,只有用'GetCreationTime'應用過濾 –