2017-01-18 11 views
0

我有一個文件夾充滿了3萬PDF文件(請不要問爲什麼)。C# - 最快的方式來循環通過一個3萬PDF文件的文件夾

我需要通過它們循環,並匹配窗口日期選擇器控件上選擇的日期值的日期。

以下是我有:

public List<FileInfo> myList = new List<FileInfo>(); 
     DirectoryInfo di = new DirectoryInfo(@"\\PDFs"); 

myList = (di.EnumerateFiles("*.pdf").Where(x => x.LastWriteTime.Date == datetime.Date).ToList()); 

我有在列表中的文件後,我然後將它們移到其它各種處理的其它位置,但一方面我肯定要加快是這個部分。

這很慢,是否有加快速度呢?

謝謝。

+0

您是否嘗試過使用PowerShell?或者它不是一個選項? – Nils

+2

爲什麼在一個文件夾中有30,000個PDF文件? – dfundako

+1

你怎麼確定這是你的緩慢?你是否在代碼上運行了一個分析器,並發現這是花費時間的地方?或者你以後會用'myList'做些什麼,那就是真正的緩慢。 –

回答

-2

如果PowerShell是一個選項(我會推薦它),試試這個:

Get-ChildItem c:\folder | Where{$_.LastWriteTime -gt (Get-Date).AddDays(-7)} 

GET-日期將在今天返回,因此上述將返回所有文件,這是在過去7天內修改。

+1

當你甚至不知道OP如何處理這些信息時,你如何推薦PowerShell? –

-1

您不必等待整個文件列表(myList)被構建 - 您可以在第一個枚舉文件之後開始處理。只需使用Parallel.ForEach下載並處理單個文件即可。在下面的例子中,我使用ConcurrentBag集合來存儲結果。

var results = new ConcurrentBag<ProcessingResult>(); 

var files = di.EnumerateFiles("*.pdf").Where(x => x.LastWriteTime.Date == datetime.Date); 
Parallel.ForEach(files, file => { 
    var newLocation = CopyToNewLocation(file); 
    var processingResult = ExecuteAditionalProcessing(newLocation); 

    results.Add(processingResult); 
}); 
+1

'Parallel.For'允許更快地處理CPU綁定任務,但它不會提高IO綁定性能(在某些情況下,它甚至會產生相反的效果) - http://stackoverflow.com/questions/868568/what -Do最條款-CPU綁定和-IO的限制均值。所以你真的認爲這個問題是CPU限制的,而不是枚舉30000個具有全局匹配的文件可能是一個瓶頸?我同意儘快處理文件是一種合適的方法,但似乎OP必須在執行任何實際處理之前擁有所有這些項目**。 –

相關問題