2011-12-11 7 views
3

私はcsvファイルを2回読む必要があります。しかし、最初の読み取り後:enother機能でファイルを使用してfile.inputstreamを2回読む

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では、コンストラクタにleaveOpenパラメータを導入してこの問題を修正しました。参照:MSDN

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

もう1つ。 usingステートメントにはSteramReadercsvReader.Close();の行)を閉じる必要がないため、StreamReaderの場合はDispose()Close()が同じです。

0

あなたが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); 

これをファイルに保存します。