2011-12-11 74 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); 

它會將它保存到文件中。