none
Descompactar aquivo compactado em várias partes RRS feed

  • Pergunta

  • Estou tentando descompactar arquivo compactado e várias partes, mas só consigo descompactar quando está em uma unica parte:

     public static byte[] Descompatar(byte[] ArquivoCompactado, out string NomeArquivoCompactado)
            {

                MemoryStream ms = new MemoryStream(ArquivoCompactado);
                ZipInputStream s = new ZipInputStream(ms);
                ZipEntry theEntry = s.GetNextEntry();
                NomeArquivoCompactado = theEntry.Name;

                if (theEntry == null)
                {
                    return new byte[0];
                }
                MemoryStream msRetorno = new MemoryStream();
                int size = 2048;
                byte[] data = new byte[size];
                while (true)
                {
                    size = s.Read(data, 0, data.Length);
                    if (size > 0)
                    {
                        msRetorno.Write(data, 0, size);
                    }
                    else
                    {
                        break;
                    }
                }
                if (s.GetNextEntry() != null)
                {
                    throw new Exception("Existe mais de um arquivo dentro do arquivo compactado.");
                }
                s.Close();
                msRetorno.Close();
                return msRetorno.ToArray();
            }

    quinta-feira, 9 de abril de 2015 17:23

Respostas

  • Obrigado pelo ajuda.

    O que fiz para resolver o meu problema no fim foi algo fácil, apenas criei um MemoryStream e nele coloquei todos as partes do arquivo a ser descompactado, utilizando o WriteTo da respectiva parte, depois utilizei a minha rotina atual para descompactar e pimba!!

    Se aguem precisar segue rotina:

      private void button1_Click(object sender, EventArgs e)
            {

                List<MemoryStream> listArquivosParticionados = new List<MemoryStream>();
                DirectoryInfo nf = new DirectoryInfo(textBox1.Text);
                MemoryStream aux = new MemoryStream();
                MemoryStream ArquivoFinal = new MemoryStream();
                string art = string.Empty;

                //Pega os arquivos particionados 
                foreach (FileInfo item in nf.GetFiles())
                {
                    FileStream fileInf = File.Open(item.FullName, FileMode.Open);
                    aux = new MemoryStream();
                    fileInf.CopyTo(aux);
                    listArquivosParticionados.Add(aux); 
                }
                foreach (var item in listArquivosParticionados)
                {
                    item.WriteTo(ArquivoFinal);
                }

                File.WriteAllBytes("c:\\ArquivoDescompactado\arquivo.mdb", Descompatar(ArquivoFinal, out art));
            }

            public static byte[] Descompatar(byte[] ArquivoCompactado, out string NomeArquivoCompactado)
            {
                MemoryStream ms = new MemoryStream(ArquivoCompactado);
                ZipInputStream s = new ZipInputStream(ms);
                ZipEntry theEntry = s.GetNextEntry();
                NomeArquivoCompactado = theEntry.Name;

                if (theEntry == null)
                {
                    return new byte[0];
                }
                MemoryStream msRetorno = new MemoryStream();
                int size = 2048;
                byte[] data = new byte[size];
                while (true)
                {
                    size = s.Read(data, 0, data.Length);
                    if (size > 0)
                    {
                        msRetorno.Write(data, 0, size);
                    }
                    else
                    {
                        break;
                    }
                }
                if (s.GetNextEntry() != null)
                {
                    throw new Exception("Existe mais de um arquivo dentro do arquivo compactado.");
                }
                s.Close();
                msRetorno.Close();
                return msRetorno.ToArray();
            }


    • Editado Hegberto sexta-feira, 10 de abril de 2015 18:53
    • Marcado como Resposta Hegberto sexta-feira, 15 de maio de 2015 18:20
    sexta-feira, 10 de abril de 2015 18:53

Todas as Respostas

  • Tente usar a biblioteca SharpZipLib, acredito que ela consiga fazer o que vc precisa.

    Segue link de um post que escrevi a respeito da mesma:

    http://netcoders.com.br/blog/manipulacao-de-arquivos-zip-com-sharpziplib/

    quinta-feira, 9 de abril de 2015 17:37
  • Obrigado pelo ajuda.

    O que fiz para resolver o meu problema no fim foi algo fácil, apenas criei um MemoryStream e nele coloquei todos as partes do arquivo a ser descompactado, utilizando o WriteTo da respectiva parte, depois utilizei a minha rotina atual para descompactar e pimba!!

    Se aguem precisar segue rotina:

      private void button1_Click(object sender, EventArgs e)
            {

                List<MemoryStream> listArquivosParticionados = new List<MemoryStream>();
                DirectoryInfo nf = new DirectoryInfo(textBox1.Text);
                MemoryStream aux = new MemoryStream();
                MemoryStream ArquivoFinal = new MemoryStream();
                string art = string.Empty;

                //Pega os arquivos particionados 
                foreach (FileInfo item in nf.GetFiles())
                {
                    FileStream fileInf = File.Open(item.FullName, FileMode.Open);
                    aux = new MemoryStream();
                    fileInf.CopyTo(aux);
                    listArquivosParticionados.Add(aux); 
                }
                foreach (var item in listArquivosParticionados)
                {
                    item.WriteTo(ArquivoFinal);
                }

                File.WriteAllBytes("c:\\ArquivoDescompactado\arquivo.mdb", Descompatar(ArquivoFinal, out art));
            }

            public static byte[] Descompatar(byte[] ArquivoCompactado, out string NomeArquivoCompactado)
            {
                MemoryStream ms = new MemoryStream(ArquivoCompactado);
                ZipInputStream s = new ZipInputStream(ms);
                ZipEntry theEntry = s.GetNextEntry();
                NomeArquivoCompactado = theEntry.Name;

                if (theEntry == null)
                {
                    return new byte[0];
                }
                MemoryStream msRetorno = new MemoryStream();
                int size = 2048;
                byte[] data = new byte[size];
                while (true)
                {
                    size = s.Read(data, 0, data.Length);
                    if (size > 0)
                    {
                        msRetorno.Write(data, 0, size);
                    }
                    else
                    {
                        break;
                    }
                }
                if (s.GetNextEntry() != null)
                {
                    throw new Exception("Existe mais de um arquivo dentro do arquivo compactado.");
                }
                s.Close();
                msRetorno.Close();
                return msRetorno.ToArray();
            }


    • Editado Hegberto sexta-feira, 10 de abril de 2015 18:53
    • Marcado como Resposta Hegberto sexta-feira, 15 de maio de 2015 18:20
    sexta-feira, 10 de abril de 2015 18:53