2017-04-10 27 views
0

我有以下代碼:MemoryStream的輸出到文件C#

string fileName = GetFileName(); 
using (var stream = new MemoryStream()) 
{ 
    using (var sw = new StreamWriter(stream)) 
    {    
     for (int i = 0; i < 20; i++) 
     { 
      sw.WriteLine(String.Format("{0};{1};{2};{3};{4};{5}", i.ToString(), (i*2).ToString(), "-_-_-", "-_" + i.ToString() + "_-", "3", "15")); 
     } 

     // Check if compression needed. 
     if (stream.Length > limit) 
     { 
      sw.Flush(); 
      stream.Position = 0; 

      using (Ionic.Zip.ZipFile zipFile = new Ionic.Zip.ZipFile()) 
      { 
       absoluteFileName = Path.GetFileName(fileName); 
       zipFile.AddEntry(absoluteFileName, stream); 

       zipFileName = Path.Combine(Path.GetDirectoryName(fileName), Path.ChangeExtension(absoluteFileName, ZipExtension)); 
       zipFile.Save(zipFileName); 
      } 
     } 
     else 
     { 
      // no compression needed 
      using (FileStream file = new FileStream(fileName, FileMode.Create, System.IO.FileAccess.Write)) 
      { 
       byte[] bytes = new byte[stream.Length]; 
       stream.Read(bytes, 0, (int)stream.Length); 
       file.Write(bytes, 0, bytes.Length); 
       //stream.Close(); 
      } 
     } 
    } 

我試圖產生的情況下的MemoryStream長度的純文本文件(以字節爲單位)的不超過字節的具體量(限制時(見條件)。

如果MemoryStream的長度不是字節的具體金額,然後創建一個壓縮文件越大。

我的問題是在別人的身體時,我嘗試寫內存流的所有內容成無需壓縮的純文本文件(stream.Length < =限制)。我得到一個39字節的文件,但是當我打開它時,它是空的,只有新的行。

我這樣做是因爲我不想直接在磁盤上創建文件,以防需要壓縮它。因此,如果最後不需要壓縮,我會將所有流內存寫入一個文件,這就是問題所在,文件是空的,只有換行符。

我在做什麼錯?

UPDATE2 我已經把下面的行之前的條件:

sw.Flush(); 
stream.Position = 0; 

而現在的內容被寫入文件。

+3

請把更多的精力投入到今後格式化你的代碼。這次我爲你做了這件事,但確實有責任讓代碼儘可能可讀。使用預覽並問問你自己是否真的想要閱讀代碼。 –

+0

@JonSkeet好的,謝謝。 – user1624552

+4

「else」分支中的'stream.Position = 0;'在哪裏? –

回答

3

我的問題是在別人身上

那麼你正在處理的是用不同的方式在第一if體。

在第一if身體,你明確地衝洗作家和倒帶流:

sw.Flush(); 
stream.Position = 0; 

你不這樣做無論是那些在else身體,所以你不會得到任何數據這已經寫入到流中(不倒帶),並且仍然可以在StreamWriter(無刷新)中緩衝數據。那是一個問題。

接下來,你要檢查你的「限價」不沖洗StreamWriter,這意味着有可能是一堆更多的數據意味着你應該壓縮,但你不是。因此,我建議您在您的if聲明完全出現之前致電sw.Flush()

最後,我強烈反對創建另一個字節數組沒有理由 - 你的最後using語句體可以只是:

stream.CopyTo(file); 
+0

否CopyTo方法出現在流上,我在Visual Studio 2008下使用.NET Framework 3.5。它只能從.NET Framework 4.0及更高版本中獲得。 – user1624552

+0

@ user1624552:如果你這麼說的話,它會很有用 - 我認爲大多數人認爲你不會被約束到10年前發佈的框架是合理的......你仍然不需要創建另一個字節數組雖然。例如,您可以使用'MemoryStream.GetBuffer()'。 –

+0

我同意,非常抱歉。非常感謝,你救了我的一天! – user1624552