2011-11-17 74 views
1

我的程序中有一些GZ壓縮資源,我需要能夠將它們寫出到臨時文件以供使用。我編寫了下列函數來寫出文件,併成功返回true或失敗時返回false。另外,我已經把一個try/catch在那裏它顯示了一個MessageBox在一個錯誤的事件:爲什麼我的GZipStream不可寫入?

private static bool extractCompressedResource(byte[] resource, string path) 
{ 
    try 
    { 
    using (MemoryStream ms = new MemoryStream(resource)) 
    { 
     using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite)) 
     { 
     using (GZipStream zs = new GZipStream(fs, CompressionMode.Decompress)) 
     { 
      ms.CopyTo(zs); // Throws exception 

      zs.Close(); 
      ms.Close(); 
     } 
     } 
    } 
    } 
    catch (Exception ex) 
    { 
    MessageBox.Show(ex.Message); // Stream is not writeable 
    return false; 
    } 

    return true; 
} 

我已經把上拋出異常的行註釋。如果我在該行上放置一個斷點並查看GZipStream,那麼我可以看到它不可寫(這是導致該問題的原因)。

我做錯了什麼,或者這是GZipStream類的限制嗎?

+2

無需關閉流在一個「使用」塊,它們將自動當它們被佈置 – musefan

+1

也關閉,作爲書面,GZipStream將GZipStream設置當處置的FileStream的。對於OP也是如此:在處理之前,您沒有在示例中明確調用.Flush在您的示例中的'zs'和'fs',我們發現了一些問題。 – Joe

回答

4

您正在錯誤地管道管道。修正:

using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite)) 
using (MemoryStream ms = new MemoryStream(resource)) 
using (GZipStream zs = new GZipStream(ms, CompressionMode.Decompress)) 
{ 
    zs.CopyTo(fs); 
} 
+0

您的解決方案有效。我可以看到發生了什麼:在讀取MemoryStream時解壓縮,並將解壓縮的數據直接寫入文件。我試圖從MemoryStream中讀取壓縮數據並在寫入文件時解壓縮。 TBH我不明白爲什麼一個人會工作,其他人不會 - 邏輯上他們應該有相同的結果。謝謝,漢斯! – Ozzah