2012-06-26 116 views
1

我的GZipStream只會解壓文件的第一行。按照預期通過7-zip提取內容併爲我提供整個文件內容。它也按照預期在cygwin和linux上使用gunzip進行提取,所以我期望這是O/S特定的(Windows 7)。GZipStream只解壓第一行

我不確定如何去解決這個問題,所以任何提示都會幫助我很多。這聽起來與this非常相似,但使用SharpZLib的結果相同。

下面是我在做什麼:

var inputFile = String.Format(@"{0}\{1}", inputDir, fileName); 
var outputFile = String.Format(@"{0}\{1}.gz", inputDir, fileName); 
var dcmpFile = String.Format(@"{0}\{1}", outputDir, fileName); 

    using (var input = File.OpenRead(inputFile)) 
    using (var fileOutput = File.Open(outputFile, FileMode.Append)) 
    using (GZipStream gzOutput = new GZipStream(fileOutput, CompressionMode.Compress, true)) 
    { 
     input.CopyTo(gzOutput); 
    } 

// Now, decompress 
using (FileStream of = new FileStream(outputFile, FileMode.Open, FileAccess.Read)) 
using (GZipStream ogz = new GZipStream(of, CompressionMode.Decompress, false)) 
using (FileStream wf = new FileStream(dcmpFile, FileMode.Append, FileAccess.Write)) 
{ 
    ogz.CopyTo(wf); 
} 
+0

如果這是相關的,我還應該補充一點,當我構建文件時,我使用Environment.NewLine()來分隔每一行。 – duckus

回答

4

你的輸出文件只包含一個一行(gzip壓縮) - 但它包含除換行符以外的文本數據的所有

您一再呼叫ReadLine(),它將返回一行文字而沒有換行符並將該文本轉換爲字節。所以,如果你有其中有一個輸入文件:

abc 
def 
ghi 

你想最終比增

abcdefghi 

的壓縮版本的輸出文件。如果你不希望這樣的行爲,爲什麼還要首先通過StreamReader?從輸入FileStream只需複製直奔GZipStream塊的時間,或使用Stream.CopyTo如果你使用.NET 4:

// Note how much simpler the code is using File.* 
using (var input = File.OpenRead(inputFile)) 
using (var fileOutput = File.Open(outputFile, FileMode.Append)) 
using (GZipStream gzOutput = new GZipStream(os, CompressionMode.Compress, true)) 
{ 
    input.CopyTo(gzOutput); 
} 

還要注意的是追加到壓縮文件很少是個好主意,除非你在單個文件中對多個「塊」進行某種特殊處理。

+0

似乎並未將文件的全部內容壓縮爲一行。問題文件只有630個字符,並且文件內容與正確解壓縮文件的第一行相同。儘管如此,我會嘗試縮短您的建議片段。 – duckus

+0

@duckus:這不符合我所看到的。我只是用一個測試文件來測試你的代碼,它的行爲完全如我所料。我不認爲你在那裏有一個U + 0000字符,這使得查看器對解壓縮文件感到驚訝。 –

+0

在我的源文件中,我使用char.ConvertFromUtf32(1)爲Control-A分隔列,並使用Environment.NewLine()分隔每行。我可能會嘗試,從直接流中壓縮內容而不是從文件中加載它們。只是爲了看看是否發生了同樣的事情。 – duckus