2015-10-15 54 views
1

我已經開發了一個小工具,將用於在C#中顯示的數據不一致,我要做的就是解釋點下方明智,寫作的物理文件名巨量成文本文件C#

  1. 獲取數據庫數據並根據日期條件寫入文件名列表的文本文件 - 輸出1
  2. 走路徑1的目錄並寫入文本文件 - 輸出2
  3. 採取PATH2,path3時和PATH4的DIR同樣和寫入文本單獨文件每個路徑輸出3/4/5
  4. 比較選項:compare output1和2並記下文本文件中的差異,然後將這個差異與output3進行比較,並再次將差異寫入另一個文件,依此類推...
  5. 我的問題是:我的最後一條路徑有超過250萬條記錄文件,每當我試圖寫它在文本文件,它掛的應用程序,它從來沒有提供輸出的,我也嘗試用最新標準,但即使是一天其中的記錄可能約爲30成千上萬它掛

對其進行篩選我搜索了很多網站,但沒有得到我能理解或能夠實現的解決方案。以下是我的嘗試代碼。

if (!txtpath3.Text.Equals(String.Empty) && System.IO.Directory.GetFiles(txtpath3.Text).Length > 0) 
{ 
    var directory = txtpath3.Text; 
    var from_dt = this.dtpickerstart.Value; 
    var end_dt = this.dtpickerend.Value; 

    DateTime from_date = from_dt; 
    DateTime to_date = end_dt; 

    DirectoryInfo di = new DirectoryInfo(directory); 
    FileSystemInfo[] files = di.GetFileSystemInfos(); 

    var op = di.GetFiles() 
     .Where(file => file.LastWriteTime >= from_date && file.LastWriteTime <= to_date); 

    foreach (string file in System.IO.Directory.GetFiles(txtpath3.Text, "*.*")) 
    { 
     TextWriter tw = new StreamWriter(dirfile3, true); 
     tw.WriteLine("" + file + ""); 
     tw.Close(); 
    } 
} 
else 
{ 

} 
+0

什麼是LACS?某種單位? – nvoigt

+0

@nvoigt Lac(或拉赫)是印度的測量值爲100 000 –

+0

好的,這是很多。我相應地編輯了我的答案。 – nvoigt

回答

3

您的foreach -loop打開和關閉所有行的文件。您應該打開並關閉循環外的文件。

using(var tw = new StreamWriter(dirfile3, true)) 
{ 
    foreach (string file in System.IO.Directory.GetFiles(txtpath3.Text, "*.*")) 
    { 
     tw.WriteLine("" + file + ""); 
    } 
} 

即使將使​​用已經存在的功能,這樣做更容易:

File.AppendAllLines(dirfile3, System.IO.Directory.GetFiles(txtpath3.Text, "*.*")); 

250萬個filesnames很多保持在RAM中的同時,你可能只用最好列舉它們:

File.AppendAllLines(dirfile3, System.IO.Directory.EnumerateFiles(txtpath3.Text, "*.*")); 
+0

謝謝兄弟,我已經測試了你的建議要點並且處理了10萬個,我將在今天晚些時候的2500萬條記錄上測試它,確認 –

+0

當我在2500000條記錄上嘗試它時,它只是沒有響應,我在調試模式下檢查了它,而我的調試器在下面的代碼後沒有繼續,它試圖加載所有文件在var op中掛起進程。 var op = di.GetFiles().Where(file => file.LastWriteTime> = from_date && file。LastWriteTime <= to_date); –

+0

請勿使用GetFiles。它會將文件的完整列表加載到RAM中。改爲嘗試'EnumerateFiles'。 – nvoigt

1

我認爲這個問題是在foreach

foreach (string file in System.IO.Directory.GetFiles(txtpath3.Text, "*.*")) 
{ 
    TextWriter tw = new StreamWriter(dirfile3, true); 
    tw.WriteLine("" + file + ""); 
    tw.Close(); 
} 

對於每一個和很多很多的文件中的每一個,你打開一個文件,追加一條線,並關閉文件,只有再次打開它,寫另一條線,等等,等等...

你剛纔應該先準備一個字符串的一切,然後只需要插入的所有文字一氣呵成,像:

StringBuilder sb = new StringBuilder(); 
foreach (string file in System.IO.Directory.GetFiles(txtpath3.Text, "*.*")) 
{ 
    sb.AppendLine(file); 
} 
File.WriteAllText(dirfile3, sb.ToString()); 
+1

似乎沒有必要先在內存中創建字符串。最好直接將文件寫入目標。 (當然無需打開和關閉流式編寫器) – Magnus

+0

@Magnus,我同意。我正在拍攝一個更通用的方法,如果來源不是已經在一個方便的'string []' – SWeko