使用readblock streamreader读取时出现ArgumentException

时间:2014-09-02 19:55:02

标签: streamreader readblock

我正在尝试根据某个字符的存在来计算大文件中的行数,并希望使用StreamReader和ReadBlock - 下面是我的代码。

 protected virtual long CalculateRowCount(FileStream inStream, int bufferSize)
        {
            long rowCount=0;
            String line;

            inStream.Position = 0;

            TextReader reader = new StreamReader(inStream);

            char[] block = new char[4096];
            const int blockSize = 4096;
            int indexer = 0;
            int charsRead = 0;
            long numberOfLines = 0;
            int count = 1;
            do
            {

                charsRead = reader.ReadBlock(block, indexer, block.Length * count);
                indexer += blockSize ;

                numberOfLines = numberOfLines + string.Join("", block).Split(new string[] { "&ENDE" }, StringSplitOptions.None).Length;
                count ++;

            } while (charsRead == block.Length);//charsRead !=0


            reader.Close();
            fileRowCount = rowCount;
            return rowCount;

        }

但我收到错误

偏移量和长度超出数组的范围,或者计数大于从索引到源集合末尾的元素数。

我不确定有什么问题......你能帮忙吗?谢谢你!

1 个答案:

答案 0 :(得分:3)

首先,仔细阅读StreamReader.ReadBlock()文档http://msdn.microsoft.com/en-us/library/system.io.streamreader.readblock.aspx并与您正在做的事情进行比较:

  • 第二个参数(索引器)应该在您传入的块的范围内,但是您在一次迭代后传递的内容可能超过它。因为看起来你想重用内存块,所以在这里传递0。
  • 第三个参数(count)表示要读入内存块的字节数;传递大于块大小的东西可能不起作用(取决于实现)
  • ReadBlock()返回实际读取的字节数,但是你增加索引器就像它总是准确地返回块的大小一样(大多数时候,它赢了)