两次读取file.inputstream

Ole*_*ich 4 c# asp.net

我需要两次读取csv文件.但在第一次阅读后:

using (var csvReader = new StreamReader(file.InputStream))
{
    fileFullText += csvReader.ReadToEnd();
    file.InputStream.Seek(0, SeekOrigin.Begin);
    csvReader.Close();
}
Run Code Online (Sandbox Code Playgroud)

在另一个函数中使用文件:

public static List<string> ParceCsv(HttpPostedFileBase file)
{
    //file.InputStream.Seek(0, SeekOrigin.Begin);
    using (var csvReader = new StreamReader(file.InputStream))
    {
       // csvReader.DiscardBufferedData();
       // csvReader.BaseStream.Seek(0, SeekOrigin.Begin);
        string inputLine = "";
        var values = new List<string>();

        while ((inputLine = csvReader.ReadLine()) != null)
        {
            values.Add(inputLine.Trim().Replace(",", "").Replace(" ", ""));
        }
        csvReader.Close();
        return values;
    } 
}
Run Code Online (Sandbox Code Playgroud)

file.Length是0.有人可以帮忙吗?

Geo*_*dze 11

其原因是,SteramReaderDispose()方法还关闭底层流; 在你的情况下file.InputStream.该using声明Dispose()含蓄地调用.StreamReaded在完成两个读取操作后,尝试替换使用处理两个-s.我记得有些流类有一个bool选项,可以在处理后打开底层流.

.NET 4.5通过leaveOpenSteamReader构造函数中引入参数来解决此问题.请参阅:MSDN

public StreamReader(
    Stream stream,
    Encoding encoding,
    bool detectEncodingFromByteOrderMarks,
    int bufferSize,
    bool leaveOpen
)
Run Code Online (Sandbox Code Playgroud)

还有一件事.你并不需要关闭SteramReader自己(与线csvReader.Close();),当你把它包在using声明中,从而Dispose()Close()是相同的情况下StreamReader.