2013-11-14 72 views
1

我有一個包含txt文件的目錄結構。通過搜索條件檢索文件列表的最快方法 - c#

我想獲取修改/創建日期在一個範圍之間的文件名列表。

到目前爲止,我有這樣的:

 DirectoryInfo directory = new DirectoryInfo(@"C:\MotionWise\Manifest\000EC902F17F"); 
     DateTime from_date = DateTime.Now.AddMinutes(-300); 
     DateTime to_date = DateTime.Now; 
     List<FileInfo> files = directory.GetFiles("*", SearchOption.AllDirectories).Where(file => file.LastWriteTime >= from_date && file.LastWriteTime <= to_date).ToList(); 

現在,我只有在全路徑名興趣。

如果我通過文件列表枚舉,我可以添加完整的路徑名到一個新的列表/數組等,但這似乎是浪費額外的努力,因爲我覺得有一種方法可以在lambda代碼中做到這一點?

如果可以在lambda碼中完成,那麼文件信息的選擇不會太「重」嗎?有沒有辦法只選擇完整的路徑名稱,而無需將每個條目加載到文件信息中?

我一直在執行dir DOS命令並捕獲Process類中的輸出。

回答

4

如果你只在路徑興趣不使用DirectoryInfo.GetFiles,因爲它返回一個數組,因爲它是一個FileInfo[]其中每個FileInfo對象包括所有信息是無論如何你對此不感興趣。你可以使用File.GetLastWriteTime來得到它。

取而代之的是使用Directory.EnumerateFiles,它懶洋洋地返回符合您的過濾條件和搜索模式的路徑。

List<string> paths = Directory.EnumerateFiles(@"C:\MotionWise\Manifest\000EC902F17F", "*", SearchOption.AllDirectories) 
    .Where(path => { 
     DateTime lastWriteTime = File.GetLastWriteTime(path); 
     return lastWriteTime >= from_date && lastWriteTime <= to_date; 
    }) 
    .ToList(); 
+0

蒂姆,任何使這個維基的理由? –

+0

@SriramSakthivel:不,意外。 –

+0

現貨 - 謝謝 –

3

上就SelectFullName

List<string> files = directory.GetFiles("*", SearchOption.AllDirectories) 
           .Where(file => file.LastWriteTime >= from_date && file.LastWriteTime <= to_date) 
           .Select(f => f.FullName) 
           .ToList(); 
+0

你讓它看起來很容易!謝謝。我會在8分鐘內點擊它作爲接受的答案(因爲它不會讓我在此之前) –

+0

哎呀另一個彈出了 –

+0

@ScottChamberlain你絕對正確。我修復了錯字,謝謝! – gleng