2013-04-16 174 views
0

我一直在尝试几天来以块加载文件,以允许用户使用非常大的(GB)文件并仍然保持程序的速度。目前,我有以下代码:将文件加载/流式传输到缓冲区/缓冲区

using (FileStream filereader = new FileStream(filename, FileMode.Open, FileAccess.Read)) 
    { 
    using (StreamReader reader = new StreamReader(filereader)) 
    { 
     while (toRead > 0 && (bytesread = reader.Read(buffer, offset, toRead)) > 0) 
     { 
     toRead -= bytesread; 
     offset += bytesread; 
     } 

     if (toRead > 0) throw new EndOfStreamException(); 

     foreach (var item in buffer) 
     { 
     temporary = temporary += item.ToString(); 
     } 
     temporary.Replace("\n", "\n" + System.Environment.NewLine); 

下面是避免任何混淆的声明(希望):

const int Max_Buffer = 5000; 
    char[] buffer = new char[Max_Buffer]; 
    int bytesread; 
    int toRead = 5000; 
    int offset = 0; 

目前该计划在5000个字节的文本文件的读取,然后处理字节转换成一个字符串,然后传入一个字符串读取器,这样我就可以获取我想要的信息。

我现在的问题是缓冲区可以在一行中途停下来,所以当我在stringreader类中取得数据时,它会引起索引/长度错误。

我需要的是要知道如何在数组中寻找一组表示行的开始的特定字符集,然后仅在该点之前返回数据以处理为字符串。

排序回溯问题后的另一个问题是我将如何保持我不想处理的数据并引入更多数据来填充缓冲区。

我希望这个解释得很好,我知道我有时会困惑,希望有人能帮助。

+1

在每次换行时都打破顶端?与使用ReadLine()相同然后你只需要向前查找。您可以使用字符串生成器来存储任何临时行(通过Max_buffer的行) –

回答

0

我会建议使用reader.ReadLine()的代替reader.Read()在你的循环

buffer=reader.ReadLine(); 
bytesread = buffer.Length*2;//Each charcter is unicode and equal to 2 bytes 

您可以然后检查是否(探路者 - bytesread)< 0 。