none
Dúvida sobre GZipStream RRS feed

  • 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.?

    terça-feira, 23 de fevereiro de 2016 21:01

Respostas

  • Pode ser o Encoder, troca seu UTF8 por este:
    Encoding.GetEncoding("iso-8859-1").GetString(bigStreamOut.ToArray());


    • Marcado como Resposta DET1 quarta-feira, 24 de fevereiro de 2016 16:35
    quarta-feira, 24 de fevereiro de 2016 03:00
  • 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
    quarta-feira, 24 de fevereiro de 2016 04:06

Todas as Respostas

  • Pode ser o Encoder, troca seu UTF8 por este:
    Encoding.GetEncoding("iso-8859-1").GetString(bigStreamOut.ToArray());


    • Marcado como Resposta DET1 quarta-feira, 24 de fevereiro de 2016 16:35
    quarta-feira, 24 de fevereiro de 2016 03:00
  • 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
    quarta-feira, 24 de fevereiro de 2016 04:06
  • 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);


    quarta-feira, 24 de fevereiro de 2016 16:35
  • Pessoal obrigado por registrar esse processo, me ajudou a resolver meu problema com agilidade!
    sexta-feira, 9 de março de 2018 13:10
  • 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

    quinta-feira, 20 de dezembro de 2018 00:34