2015-12-30 66 views
1

對不起,如果這是一個noob問題,這是我第一次使用C#。在C中解壓縮.gz流#

此代碼的目的是檢索一個.gz文件,解壓縮它並將內容推送到一個字符串中,然後我可以使用它來封送XML。

從服務器請求一個特定的.gz文件後,我將結果發送到一個流,像這樣:

HttpWebResponse OauthResponse = (HttpWebResponse)OauthRequest.GetResponse(); 
Stream stream = OauthResponse.GetResponseStream(); 

但是,我找不到任何答案,至於如何解壓縮的。廣州流,只有如何從文件中這樣做。所以,我用這節省了進來。廣州到本地文件:

using (StreamReader sr = new StreamReader(stream)) 
{ 
    using (BinaryWriter writer = new BinaryWriter(File.Open("currentSession.gz", FileMode.Create))) 
    { 
     writer.Write(sr.ReadToEnd()); 
    } 
} 

然後試圖解壓這個新創建的文件:

using (GZipStream instream = new GZipStream(File.OpenRead("currentSession.gz"), CompressionMode.Decompress)) 
{ 
    using (FileStream outputStream = new FileStream("currentXML.xml", FileMode.Append, FileAccess.Write)) 
    { 
     int bufferSize = 8192, bytesRead = 0; 
     byte[] buffer = new byte[bufferSize]; 
     while ((bytesRead = instream.Read(buffer, 0, bufferSize)) > 0) 
     { 
      outputStream.Write(buffer, 0, bytesRead); 
     } 
    } 
} 

的目的是,它會創建一個然後可以調用XML文件來將節點編組爲一個對象。當我雖然運行它,我得到:

「System.IO.InvalidDataException」未處理的異常發生在System.dll中

附加信息:幻數的gzip數據頭不是 正確。確保你傳入一個GZip流。

我的問題是我是否遵循正確的過程,即獲取流中的.gz文件,保存它,調用新保存的.gz文件解壓縮並保存到XML文件,調用新的.xml然後封送它。如果是這樣,我在這裏做錯了什麼。如果沒有,是否有辦法在gz中獲取XML,而無需創建和加載新文件?

回答

0

最後,我設法使它通過將.gz流保存到文件中,然後閱讀這些文件來解壓縮xml,然後保存xml文件。再往下,當數據已經編組時,請刪除文件以避免浪費空間。

public static void saveDecompress(Stream LPDataStream, int c) 
    { 
//Save the incoming .gz in a file 
     using (FileStream output = File.OpenWrite("temp/session" + c + ".gz")) 
     { 
      LPDataStream.CopyTo(output); 
     } 

     DirectoryInfo directorySelected = new DirectoryInfo("temp/"); 
//Iterate through the .gz files to extract xml 
     foreach (FileInfo fileToDecompress in directorySelected.GetFiles("*.gz")) 
     { 
      using (FileStream originalFileStream = fileToDecompress.OpenRead()) 
      { 
       string currentFileName = fileToDecompress.FullName; 
       string newFileName = currentFileName.Remove(currentFileName.Length - fileToDecompress.Extension.Length) + ".xml"; 

//Save XML in file 
       using (FileStream decompressedFileStream = File.Create(newFileName)) 
       { 
        using (GZipStream decompressionStream = new GZipStream(originalFileStream, CompressionMode.Decompress)) 
        { 
         decompressionStream.CopyTo(decompressedFileStream); 
        } 
       } 
      } 
     } 
    } 

我希望這可以幫助其他人解決這個問題。

1

此異常拋出,因爲你正試圖與GZipStream解壓流心不是一個有效的GZip,您可以使用此代碼重現此異常:

Stream stream = new MemoryStream(Encoding.UTF8.GetBytes("Hellow")); 

try 
{ 
    using (var instream = new GZipStream(stream, CompressionMode.Decompress)) 
    using (var outputStream = new FileStream("currentXML.xml", FileMode.Append, FileAccess.Write)) 
    { 
     instream.CopyTo(outputStream); 
    } 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.Message); 
} 

輸出

神奇的數字在GZip標題中是不正確的。確保你傳入一個GZip流。

所以,你必須保證你reiving從您的WebRequest一個GZIP流,

你也可以簡化你的代碼,就像這樣:

HttpWebResponse OauthResponse = (HttpWebResponse)OauthRequest.GetResponse(); 
Stream stream = OauthResponse.GetResponseStream(); 
using (var instream = new GZipStream(stream, CompressionMode.Decompress)) 
using (var outputStream = new FileStream("currentXML.xml", FileMode.Append, FileAccess.Write)) 
    instream.CopyTo(outputStream);