读取文件输入流两次

本文关键字:两次 文件 输入流 读取 | 更新日期: 2023-09-27 18:17:33

我需要读取csv文件两次。 但初读后:

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

在 enother 函数中使用文件:

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

该文件。长度为 0。有人可以帮忙吗?

读取文件输入流两次

原因是SteramReaderDispose()方法也关闭了底层流;在您的情况下file.InputStream.using语句隐式调用Dispose()。在完成两个读取操作后,尝试将 using 替换为释放两个 StreamReaded -s。我记得有些流类有一个布尔选项,可以在释放后保持底层流打开。

.NET 4.5 通过在构造函数中引入leaveOpen参数SteamReader修复了此问题。请参阅: MSDN

public StreamReader(
    Stream stream,
    Encoding encoding,
    bool detectEncodingFromByteOrderMarks,
    int bufferSize,
    bool leaveOpen
)

还有一件事。当您将其包装在语句中时,您不需要自己关闭SteramReader(带有 csvReader.Close(); 的行using因此Dispose()Close()StreamReader的情况下是相同的。

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

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

它会将其保存到文件中。