none
Pegar ordenadamente arquivos de um ZIP RRS feed

  • Pergunta

  • É possível pegar os arquivos de um .zip de forma ordenada por nome?

    Eu estou utilizando o ICSharpCode.

    Isso é muito importante para mim pois posso ter vários arquivos e ficar salvando para ordernar é muito demorado..

    Obrigado!

    Hegberto

    terça-feira, 12 de junho de 2012 18:42

Respostas

  • Consegui!

    Mudei a forma de busca e ordenação desta forma foi possivel.

    Segue:

    public static List<string> RetornaNomeArquivosZipOrdenado(MemoryStream mr, List<string> arquivosNomes)
            {
                ZipFile zipFile = new ZipFile(mr);
    
                int qtdArquivos = 0;
                qtdArquivos = (int) zipFile.Count;
    
                for (int i = 0; i < qtdArquivos; i++)
                {
                    arquivosNomes.Add(zipFile[i].Name);
                }
                arquivosNomes.Sort();
                return arquivosNomes;
            }
            public static byte[] DescompatarArquivoExpecificoZip(MemoryStream mr , string nomeArquivoAtual)
            {
                ZipFile zipFile = new ZipFile(mr);
                ZipEntry Entry = null;
                Entry = zipFile.GetEntry(nomeArquivoAtual);                
                MemoryStream msRetorno = new MemoryStream();
                zipFile.GetInputStream(Entry).CopyTo(msRetorno);
                    
                return msRetorno.ToArray();
            }
    
            
            public void RetornaPlanilhasOrdenadasArqPorArq(MemoryStream mr)
            {
                List<string> listaNomeArquivosOrdenados = new List<string>();
                
                listaNomeArquivosOrdenados = RetornaNomeArquivosZipOrdenado(mr, listaNomeArquivosOrdenados);
                
                foreach (string nome in listaNomeArquivosOrdenados)
                {
                    byte[] Arquivos = DescompatarArquivoExpecificoZip(mr,nome);
                    if (Arquivos != null)
                        armazenaSheets.SheetsOrdenadas = Funcoes.abreArquivoExcel(new MemoryStream(Arquivos));
                }
            }

    foi moleza no fim!
    • Marcado como Resposta Hegberto quinta-feira, 14 de junho de 2012 20:13
    quinta-feira, 14 de junho de 2012 20:13

Todas as Respostas

  • Prezados()

    Criei um script para realizar esta ordenação.

    Primeiro eu busco os nomes dos arquivos:

        public void DescompactaArquivo(ZipInputStream Arquivo)
            {
                List<string> NomesArquivos = new List<string>();
                ZipEntry Entry = null;
                List<string> listaNomeArquivosOrdenados = new List<string>();
                listaNomeArquivosOrdenados = NomeArquivosZipados(Arquivo, out Entry, listaNomeArquivosOrdenados);
                
                Entry = null;
                foreach (string nome in listaNomeArquivosOrdenados)
                {
                    byte[] Arquivos = DescompatarProximoArquivo(Arquivo, out Entry, true,nome);
                    if (Arquivos != null)
                        armazenaSheets.SheetsOrdenadas = Funcoes.abreArquivoExcel(new MemoryStream(Arquivos));
                }
            }
      public List<string> NomeArquivosZipados(ZipInputStream ArquivoCompactado, out ZipEntry Entry, List<string> arquivosNomes)
            {
                    do
                    {
                        Entry = ArquivoCompactado.GetNextEntry();
                        if (Entry == null)
                        {
                            ArquivoCompactado.Close();
                            arquivosNomes.Sort();
                            return arquivosNomes;
                        }
                        arquivosNomes.Add(Entry.Name);
                    }
                    while (Entry != null);
    
                    arquivosNomes.Sort();
                    return arquivosNomes;
            }

    Depois eu utilizo o nome para abrir o arquivo expecífico, utilizei o ZipFile pois com ele eu posso dar um GetEntry(nomeArquivo) ai sim eu posso pegar o primeiro que eu quiser. Não encontrei outra forma.

     public static byte[] DescompatarProximoArquivo(ZipInputStream ArquivoCompactado, out ZipEntry Entry, bool ordenado, string nomeArquivoAtual)
            {
                ZipFile arquivoZip = null;
                if (ordenado)
                    Entry = ArquivoCompactado.GetNextEntry();
                else
                {
                    arquivoZip = new ZipFile(File.OpenRead(DiretorioArquivoZipado));
                    Entry = arquivoZip.GetEntry(nomeArquivoAtual);
                }
                if (Entry == null)
                {
                    ArquivoCompactado.Close();
                    return null;
                }
                MemoryStream msRetorno = new MemoryStream();
                if (!ordenado)
                {
                    int size = 2048;
                    byte[] data = new byte[size];
                    while (true)
                    {
                        size = ArquivoCompactado.Read(data, 0, data.Length);
                        if (size > 0)
                        {
                            msRetorno.Write(data, 0, size);
                        }
                        else
                        {
                            break;
                        }
                    }
                    msRetorno.Close();
                }
                else
                {
                    arquivoZip.GetInputStream(Entry).CopyTo(msRetorno);
                }
                return msRetorno.ToArray();
            }

    Funciona!

    Mas, tenho um problema.

    Minha aplicação pode ter o arquivo físico, conforme exemplo utilizado acima, ou o arquivo já em memória ou seja eu não tenho como abrir este arquivo físico.

    Já tentei de tudo para converter,adicionar etc.. o meu Stream para dentro do ZipFile e não dá certo.. formas que eu tentei;

    =======================================================

    ZipInputStream ArquivoCompactado;

    arquivoZip = new ZipFile(ArquivoCompactado);

    =======================================================

    entre outras... se alguem puder me ajudar!

    quinta-feira, 14 de junho de 2012 13:56
  • Consegui!

    Mudei a forma de busca e ordenação desta forma foi possivel.

    Segue:

    public static List<string> RetornaNomeArquivosZipOrdenado(MemoryStream mr, List<string> arquivosNomes)
            {
                ZipFile zipFile = new ZipFile(mr);
    
                int qtdArquivos = 0;
                qtdArquivos = (int) zipFile.Count;
    
                for (int i = 0; i < qtdArquivos; i++)
                {
                    arquivosNomes.Add(zipFile[i].Name);
                }
                arquivosNomes.Sort();
                return arquivosNomes;
            }
            public static byte[] DescompatarArquivoExpecificoZip(MemoryStream mr , string nomeArquivoAtual)
            {
                ZipFile zipFile = new ZipFile(mr);
                ZipEntry Entry = null;
                Entry = zipFile.GetEntry(nomeArquivoAtual);                
                MemoryStream msRetorno = new MemoryStream();
                zipFile.GetInputStream(Entry).CopyTo(msRetorno);
                    
                return msRetorno.ToArray();
            }
    
            
            public void RetornaPlanilhasOrdenadasArqPorArq(MemoryStream mr)
            {
                List<string> listaNomeArquivosOrdenados = new List<string>();
                
                listaNomeArquivosOrdenados = RetornaNomeArquivosZipOrdenado(mr, listaNomeArquivosOrdenados);
                
                foreach (string nome in listaNomeArquivosOrdenados)
                {
                    byte[] Arquivos = DescompatarArquivoExpecificoZip(mr,nome);
                    if (Arquivos != null)
                        armazenaSheets.SheetsOrdenadas = Funcoes.abreArquivoExcel(new MemoryStream(Arquivos));
                }
            }

    foi moleza no fim!
    • Marcado como Resposta Hegberto quinta-feira, 14 de junho de 2012 20:13
    quinta-feira, 14 de junho de 2012 20:13