Usuário com melhor resposta
Dúvida sobre GZipStream

Pergunta
-
Boas senhores, uso vs2010 c#
Compactei alguns arquivos via GZipStream diretamente em um diretório...
Agora preciso descompactar alguns arquivos xml....
Mas quero fazer isso em memória, pois vou usar os dados do xml e depois ele pode continuar zipado...
Pesquisando na internet cheguei no código abaixo...mas quando faço o copyto da o famoso erro - "O número mágico no cabeçalho GZip não está correto"
XmlDocument xmlDocument = new XmlDocument(); FileInfo arqInf = new FileInfo(arquivo); string voXml = string.Empty; FileStream voArq = arqInf.OpenRead(); byte[] buffer = new byte[voArq.Length]; using (var inStream = new MemoryStream(buffer)) using (var bigStream = new GZipStream(inStream, CompressionMode.Decompress)) using (var bigStreamOut = new MemoryStream()) { bigStream.CopyTo(bigStreamOut); voXml = Encoding.UTF8.GetString(bigStreamOut.ToArray()); xmlDocument.Load(voXml); }
Alguém teria a sintaxe correta para tratar o arquivo em memoria.?
Respostas
-
-
Acho que a solução do Cesar vai te ajudar, mas a título de futuras pesquisas no tópico, deixo esse código que está totalmente funcional, da internet.
Use o OpenDialog para escolher um arquivo compactado e faça a descompactação em memória, crie o xml a partir do array de bytes e utilize como datasource no datagriview.
static byte[] Decompress(byte[] gzip) { using (GZipStream stream = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress)) { const int size = 4096; byte[] buffer = new byte[size]; using (MemoryStream memory = new MemoryStream()) { int count = 0; do { count = stream.Read(buffer, 0, size); if (count > 0) { memory.Write(buffer, 0, count); } } while (count > 0); return memory.ToArray(); } } } private void button1_Click(object sender, EventArgs e) { OpenFileDialog dlgOpen = new OpenFileDialog(); if (dlgOpen.ShowDialog() == DialogResult.OK) { byte[] file = File.ReadAllBytes(dlgOpen.FileName); byte[] decompressed = Decompress(file); MemoryStream ms = new MemoryStream(decompressed); var xmlFile = XmlReader.Create(ms, new XmlReaderSettings()); DataSet ds = new DataSet(); ds.ReadXml(xmlFile); xmlFile.Close(); dataGridView1.DataSource = ds.Tables[0]; } } }
Att,
Antero Marques
- Marcado como Resposta DET1 quarta-feira, 24 de fevereiro de 2016 16:35
- Editado Antero Marques domingo, 23 de dezembro de 2018 06:04 Melhora
Todas as Respostas
-
-
Acho que a solução do Cesar vai te ajudar, mas a título de futuras pesquisas no tópico, deixo esse código que está totalmente funcional, da internet.
Use o OpenDialog para escolher um arquivo compactado e faça a descompactação em memória, crie o xml a partir do array de bytes e utilize como datasource no datagriview.
static byte[] Decompress(byte[] gzip) { using (GZipStream stream = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress)) { const int size = 4096; byte[] buffer = new byte[size]; using (MemoryStream memory = new MemoryStream()) { int count = 0; do { count = stream.Read(buffer, 0, size); if (count > 0) { memory.Write(buffer, 0, count); } } while (count > 0); return memory.ToArray(); } } } private void button1_Click(object sender, EventArgs e) { OpenFileDialog dlgOpen = new OpenFileDialog(); if (dlgOpen.ShowDialog() == DialogResult.OK) { byte[] file = File.ReadAllBytes(dlgOpen.FileName); byte[] decompressed = Decompress(file); MemoryStream ms = new MemoryStream(decompressed); var xmlFile = XmlReader.Create(ms, new XmlReaderSettings()); DataSet ds = new DataSet(); ds.ReadXml(xmlFile); xmlFile.Close(); dataGridView1.DataSource = ds.Tables[0]; } } }
Att,
Antero Marques
- Marcado como Resposta DET1 quarta-feira, 24 de fevereiro de 2016 16:35
- Editado Antero Marques domingo, 23 de dezembro de 2018 06:04 Melhora
-
Senhores obrigado pelo retorno.....
Fiz o seguinte...já havia testado esta função de descompactar pois tb achei na internet...
mas fiz da seguinte forma....sem usar o stream, acredito que o stream do gz dentro da função resolveu...
byte[] file = File.ReadAllBytes(arquivoArq); byte[] decompressed = Descompactar(file); string voXml = System.Text.UTF8Encoding.UTF8.GetString(decompressed); XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(voXml);
-
-
Pra mim, a função que funciona é:
private static string GzipDecodeWW(string inputStr) { byte[] inputBytes = Convert.FromBase64String(inputStr); using (var inputStream = new MemoryStream(inputBytes)) using (var gZipStream = new GZipStream(inputStream, CompressionMode.Decompress)) using (var outputStream = new MemoryStream()) { gZipStream.CopyTo(outputStream); var outputBytes = outputStream.ToArray(); string decompressed = Encoding.UTF8.GetString(outputBytes); return decompressed; } }
Vai nessa que é sucesso!! rs