读取Stream中的多个文件

时间:2012-02-07 13:06:56

标签: c# .net-3.5 stream filestream

开平!

如何一次阅读多个文本文件? 我想要做的是读取一系列文件并将它们全部附加到一个大文件中。我当然是这样做的:

  1. 获取每个文件并使用StreamReader打开它
  2. 在StringBuilder中完全读取StreamReader并将其附加到当前的StreamBuilder
  3. 检查是否超出了内存大小,如果是,则在文件末尾写入StringBuilder并清空StrigBuilder
  4. 不幸的是,我观察到平均读取速度仅为4MB /秒。我注意到当我在磁盘上移动文件时,我获得了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();
            }
    

    这就是我现在正在做的事情。

3 个答案:

答案 0 :(得分:3)

首先,您需要区分(二进制数据)和StreamReader或更多TextReader s(文本数据)。

听起来你想创建一个TextReader的子类,它将接受(在它的构造函数中)一堆TextReader个参数。你不需要在这里急切地阅读任何东西 ...但是在你覆盖的Read方法中,你应该从“当前”读者读取,直到用尽,然后开始下一个。请记住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();
}

我强烈怀疑已经有第三方库进行这种分离,请注意......

答案 1 :(得分:3)

如果你正在做的只是读取文件,然后将它们连接到磁盘上的新文件,则可能根本不需要编写代码。使用Windows复制命令:

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

如果需要,可以通过Process.Start拨打此电话。

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

答案 2 :(得分: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));
    }
}