2010-06-18 84 views
7

我有一些下載gzip文件的代碼,並解壓縮它們。問題是,我無法解壓縮整個文件,只能讀取前4096個字節,然後再讀取約500個字節。GZipStream沒有讀取整個文件

Byte[] buffer = new Byte[4096]; 
int count = 0; 
FileStream fileInput = new FileStream("input.gzip", FileMode.Open, FileAccess.Read, FileShare.Read); 
FileStream fileOutput = new FileStream("output.dat", FileMode.Create, FileAccess.Write, FileShare.None); 
GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, true); 

// Read from gzip steam 
while ((count = gzipStream.Read(buffer, 0, buffer.Length)) > 0) 
{ 
    // Write to output file 
    fileOutput.Write(buffer, 0, count); 
} 

// Close the streams 
... 

我檢查了下載的文件;壓縮時爲13MB,幷包含一個XML文件。我已經手動解壓縮了XML文件,並且內容都在那裏。但是,當我使用此代碼執行此操作時,它僅輸出XML文件的最開始部分。

任何人有任何想法,爲什麼這可能會發生?

+0

當我在寫一個解壓縮程序我記得得到這個問題。不過,我已經看到了我最終使用的工作代碼,除了被'使用'塊封裝之外,它看起來像你的。 – 2010-06-18 09:20:18

+3

你在調用Flush()方法嗎? – n535 2010-06-18 09:20:31

+0

嘗試沖洗(),沒有幫助。 – Edgar 2010-06-18 09:26:35

回答

1

我最終使用gzip可執行文件來進行解壓縮而不是GZipStream。由於某些原因它無法處理該文件,但可執行文件可以。

+0

您能否發佈您的最終版本。我想看看你如何使用gzip可執行文件。 – ManInMoon 2014-11-19 11:07:39

+0

對不起,我無法再訪問該代碼。它使用Process類來調用gzip可執行文件。這可能有助於:http://www.dotnetperls.com/7-zip – Edgar 2014-11-20 07:42:39

4

編輯

儘量不要離開GZipStream開:

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress, 
                     false); 

GZipStream gzipStream = new GZipStream(fileInput, CompressionMode.Decompress); 
+0

是的,我試過CopyTo()。結果是一樣的。我不知道爲什麼它不能讀得比它更多。 – Edgar 2010-06-18 09:47:25

+0

嘗試使用語句;不用找了。 – Edgar 2010-06-18 10:00:47

+0

嘗試不離開GZipStream打開;不用找了。 – Edgar 2010-06-18 10:47:37

0

你叫上fileOutputCloseFlush? (或者將其包裝在using中,這是推薦的做法。)如果您沒有在程序結束時文件可能未刷新到磁盤。

+0

讀完後,所有3個流都關閉。問題不在於數據沒有正確寫入輸出文件,而是Read()不讀取整個輸入文件。 可能會打斷它嗎?它在每次停止前都會讀取確切的字節數,這很好奇。 – Edgar 2010-06-18 09:50:32

+0

第一次閱讀後'count'的值是多少? – 2010-06-18 10:06:28

+0

第一次讀取4096後,第二次讀取532,然後停止。 – Edgar 2010-06-18 10:14:15

1

同樣的事情發生在我身上。在我的情況下,最多隻能讀取6行,然後到達文件結尾。所以我意識到,雖然擴展名是gz,但它被另一種不受GZipStream支持的算法壓縮。所以我用SevenZipSharp庫,它的工作。這是我的代碼

您可以使用SevenZipSharp庫

using (var input = File.OpenRead(lstFiles[0])) 
{ 
    using (var ds = new SevenZipExtractor(input)) 
    { 
     //ds.ExtractionFinished += DsOnExtractionFinished; 

     var mem = new MemoryStream(); 
     ds.ExtractFile(0, mem); 

     using (var sr = new StreamReader(mem)) 
     { 
      var iCount = 0; 
      String line; 
      mem.Position = 0; 
      while ((line = sr.ReadLine()) != null && iCount < 100) 
      { 
       iCount++; 
       LstOutput.Items.Add(line); 
      } 

     } 
    } 
}