2015-12-30 72 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);