2012-02-07 52 views
1

Hei!讀取流中的多個文件

如何一次讀取多個文本文件? 我想要做的是讀取一系列文件並將其全部添加到一個大文件中。 Curently我這樣做:

  1. 採取的每個文件,並與一個StreamReader
  2. 在一個StringBuilder讀取的StreamReader完全打開它,如果超過了內存大小追加到當前StreamBuilder
  3. 檢查,如果是在文件的末尾寫入StringBuilder並清空StrigBuilder

不幸的是,我觀察到讀取速度avg僅爲4MB/sec。我注意到,當我在磁盤上移動文件時,速度爲40 MB /秒。 我正在考慮緩衝Stream中的文件,並像寫作一樣讀取它們。任何想法我怎麼能做到這一點?

更新:

foreach (string file in System.IO.Directory.GetFiles(InputPath)) 
     { 
      using (StreamReader sr = new StreamReader(file)) 
      { 

       try 
       { 
        txt = txt+(file + "|" + sr.ReadToEnd()); 
       } 
       catch // out of memory exception 
       { 
        WriteString(outputPath + "\\" + textBox3.Text, ref txt); 
        //sb = new StringBuilder(file + "|" + sr.ReadToEnd()); 
        txt = file + "|" + sr.ReadToEnd(); 
       } 

      } 

      Application.DoEvents(); 
     } 

這是我現在怎麼做。

+0

您使用的是什麼版本的.Net? – svick 2012-02-07 13:08:33

+0

我使用:.net 3.5 – 2012-02-07 13:11:04

+0

郵政編碼。 .NET中的流類可以做得比這更好。另外,根據.NET版本,流上的方法可以通過.CopyTo從一個流直接複製到另一個流,而不需要中介。 – Joe 2012-02-07 13:11:37

回答

1

這應該是快(但它會加載整個文件在內存中,因此可能不會在每一個需要適合):

string[] files = { @"c:\a.txt", @"c:\b.txt", @"c:\c.txt" }; 

FileStream outputFile = new FileStream(@"C:\d.txt", FileMode.Create); 

using (BinaryWriter ws = new BinaryWriter(outputFile)) 
{ 
    foreach (string file in files) 
    { 
     ws.Write(System.IO.File.ReadAllBytes(file)); 
    } 
} 
3

一件事,你需要區分流(二進制數據)和StreamReader s或更一般地TextReader s(文本數據)。

這聽起來像你想創建一個TextReader的子類,它將接受(在其構造函數中)一堆TextReader參數。你不需要急切地閱讀這裏的任何東西 ......但是在你覆蓋的方法中,你應該從「當前」閱讀器讀取,直到用完爲止,然後從下一個開始。請記住,Read已經來填補它被賦予了緩衝區 - 所以你可以這樣做:

while (true) 
{ 
    int charsRead = currentReader.Read(buffer, index, size); 
    if (charsRead != 0) 
    { 
     return charsRead; 
    } 
    // Adjust this based on how you store the readers... 
    if (readerQueue.Count == 0) 
    { 
     return 0; 
    } 
    currentReader = readerQueue.Dequeue(); 
} 

我強烈懷疑,已經有第三方庫做這樣多路分解的,頭腦你...

3

如果你正在做的是讀取文件,然後將它們連接在一起成爲磁盤上的新文件,則可能根本不需要編寫代碼。使用Windows複製命令:

C:\> copy a.txt+b.txt+c.txt+d.txt output.txt 

你可以,如果你想通過Process.Start調用它。

這當然假設您沒有對文件或其內容進行任何自定義邏輯。