StreamReader ReadLine正在修改/不释放Stream

时间:2013-09-18 13:41:50

标签: c# asp.net csv io stream

我使用FileHelpers来解析在ASP.NET应用上上传的CSV文件。

将上传两个不同的CSV文件结构(即不同数量的列),因此在使用要解析的结构模型创建FileHelpers引擎之前,我读取文件的第一行,如下所示:

string line = "";

using (StreamReader reader = new StreamReader(file.InputStream))
{
    line = reader.ReadLine();
}

int fieldCount = line.Count(l => l == ',');

这是有效的,并且给了我列数,但它打破了我想对file.InputStream做的任何其他事情:

var engine = new FileHelperEngine<CSVModel>();
CSVModel[] records;
records = (CSVModel[])engine.ReadStream(new StreamReader(file.InputStream),
    Int32.MaxValue);
// etc etc

为什么会这样?我试图删除using,只是手动关闭()StreamReader,但它没有帮助。

2 个答案:

答案 0 :(得分:1)

您遇到的问题是因为内置的Stream类在处置或关闭它们时会处理它们。

由于反直觉,如果您仍在使用它,您将需要不关闭流,在访问它之前重新打开它,或者如果您想在其中使用它,请将其复制到MemorStream中不止一个地方。

This question有一些解释。

编辑:(在Jim的评论之后)

或者,您可以通过在构造函数中使用参数来通知StreamReader不要关闭基础流。 (MSDN Documentation

答案 1 :(得分:0)

您应该在第一次阅读后重置流的位置:

file.InputStream.Position = 0;