2

我正在使用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

为什么会这样?我试图拿走usingStreamReader 并手动关闭(),但它没有帮助。

4

2 回答 2

1

您遇到的问题是因为内置的 Stream 类在它们自己被释放或关闭后会释放底层流。

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

这个问题有一些解释。

编辑:(在吉姆的评论之后)

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

于 2013-09-18T14:08:15.253 回答
0

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

file.InputStream.Position = 0;
于 2013-09-18T13:43:49.873 回答