2012-02-07 37 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调用它。

这当然假设您没有对文件或其内容进行任何自定义逻辑。