2011-12-11 72 views
3

我需要读取两次csv文件。但一读之后:在enother功能使用文件读取file.inputstream两次

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

根据您的代码,您只能阅读一次,请更新您的代码。 – Shai

+0

你不需要调用csvReader.Close();它将通过使用语句来关闭 –

回答

7

原因是SteramReaderDispose()方法也关闭了基础流;在你的情况下file.InputStream。隐含地声明using声明呼叫Dispose()。在完成两个读取操作后,尝试使用处置StreamReaded-s进行替换。我记得有些流类有一个布尔选项,可以在处理后让底层的流打开。

.NET 4.5通过在SteamReader构造函数中引入leaveOpen参数解决了此问题。参见:MSDN

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

还有一件事。当您将其包装在using声明中时,您不需要自行关闭SteramReadercsvReader.Close();的行),因此和Close()StreamReader的情况下是相同的。

0

如果您使用HttpPostedFileBase你需要先克隆它,
使用代码这个混帐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); 

它会将它保存到文件中。