正在读取流中的多个文件



嗨!

如何一次读取多个文本文件?我想做的是读取一系列文件,并将所有文件附加到一个大文件中。目前我正在这样做:

  1. 获取每个文件并用StreamReader打开
  2. 在StringBuilder中完全读取StreamReader,并将其附加到当前StreamBuilder
  3. 检查是否超过内存大小,如果超过,则在文件末尾写入StringBuilder并清空StrigBuilder

不幸的是,我观察到平均读取速度只有4MB/秒。我注意到,当我在磁盘上移动文件时,速度达到了40 MB/秒。我正在考虑将文件缓冲在流中,并像写作一样一次读取所有文件。知道我该如何做到这一点吗?

更新:

 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();
        }

我现在就是这样做的。

首先,您需要区分(二进制数据)和StreamReaders或更常见的TextReaders(文本数据)。

听起来你想创建一个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();
}

我强烈怀疑已经有第三方图书馆在做这种端庄的事了,请注意。。。

如果您所要做的只是读取文件,然后将它们连接到磁盘上的一个新文件中,那么您可能根本不需要编写代码。使用Windows复制命令:

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

如果您愿意,可以通过Process.Start进行调用。

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

这应该很快(但它会将整个文件加载到内存中,因此可能不适合所有需要):

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));
    }
}

相关内容

  • 没有找到相关文章

最新更新