我使用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,但它没有帮助。
答案 0 :(得分:1)
您遇到的问题是因为内置的Stream类在处置或关闭它们时会处理它们。
由于反直觉,如果您仍在使用它,您将需要不关闭流,在访问它之前重新打开它,或者如果您想在其中使用它,请将其复制到MemorStream中不止一个地方。
This question有一些解释。
编辑:(在Jim的评论之后)
或者,您可以通过在构造函数中使用参数来通知StreamReader不要关闭基础流。 (MSDN Documentation)
答案 1 :(得分:0)
您应该在第一次阅读后重置流的位置:
file.InputStream.Position = 0;