StreamReader ReadLine 正在修改/不释放 Stream

本文关键字:释放 Stream 修改 ReadLine StreamReader | 更新日期: 2023-09-27 18:31:43

我正在使用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 ReadLine 正在修改/不释放 Stream

您遇到的问题是,内置的 Stream 类在释放或关闭后会释放基础流。

尽管它有悖常理,但如果您仍在使用它,则需要不关闭流,或者在访问之前重新打开它,或者如果您想在多个地方使用它,则需要将其复制到 MemorStream 中。

这个问题有一些解释。

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

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

您应该在

第一次读取后重置流的位置:

file.InputStream.Position = 0;