两次读取file.inputstream

时间:2011-12-11 07:34:09

标签: c# asp.net

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

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

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

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;
    } 
}

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

2 个答案:

答案 0 :(得分:11)

原因是SteramReader的{​​{1}}方法也关闭了基础流;在您的情况下Dispose()file.InputStream语句隐式调用using。在完成两个读取操作后,尝试替换使用处理Dispose() - s。我记得有些流类有一个bool选项,可以在处理后打开底层流。

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

SteamReader

还有一件事。在public StreamReader( Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int bufferSize, bool leaveOpen ) 语句中包装它时,您不需要自己关闭SteramReadercsvReader.Close();行),因此usingDispose()是相同的Close()的情况。

答案 1 :(得分:1)

如果你使用HttpPostedFileBase,你需要先克隆它,
使用这个git here的代码 或者只是将其添加为命名空间中的类:

public static class HttpPostedFileBaseExtensions
{
    public static Byte[] ToByteArray(this HttpPostedFileBase value)
    {
        if (value == null)
            return null;
        var array = new Byte[value.ContentLength];
        value.InputStream.Position = 0;
        value.InputStream.Read(array, 0, value.ContentLength);
        return array;
    }
}

现在您可以像这样阅读HttpPostedFileBase:

private static void doSomeStuff(HttpPostedFileBase file)
{
    try
    {
        using (var reader = new MemoryStream(file.ToByteArray()))
        {
            // do some stuff... say read it to xml
            using (var xmlTextReader = new XmlTextReader(reader))
            {                    

            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

使用此功能后,您仍然可以在主代码中输入:

file.SaveAs(path);

并将其保存到文件中。