+6 votos
132 visitas

Preciso realizar uma rotina que irá ler vários registros de uma tabela, e pegar os arquivos de um campo do registro, para salvar todos eles em um arquivo compactado.

Se eu selecionar todos os registros pelo BEF, o arquivo está lá como MemoryStream eu teria que salvar ele em um arquivo temporário para depois compactar ele?

Tem algum método na tecnologia que já me retorne o arquivo para que eu possa compactar eles?

 

List<TissMonitoramentoArquivoGerado> arquivos = TissMonitoramentoArquivoGerado.GetMany(criterio);

foreach (TissMonitoramentoArquivoGerado arquivo in arquivos)
{
    IncluirArquivoNoZip(arquivo.ArquivoGerado.Content);  //aqui contém um MemoryStream

}

 

por (196 pontos) | 132 visitas

1 Resposta

+5 votos
Melhor resposta

Utilize a classe Benner.Tecnologia.Common.FileField:

Obtendo o nome do arquivo:

FileField field = (FileField) entidade.Fields["NOME_CAMPO"]
string nomeArquivo = field.Name;

Obtendo o stream do arquivo:

MemoryStream memoryStream = new MemoryStream();
FileField.RetrieveContents(entidade, "NOMECAMPO", memoryStream);

Você pode criar o arquivo zip diretamente para memória ou arquivo, utilize a biblioteca SharpZipLib. Exemplos de como utilizá-la podem ser encontradas no link https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples

por (230 pontos)
selecionada por
Realizei o teste desta maneira, conforme o código abaixo, porém ao abrir meu arquivo compactado, o arquivo interno dentro dele não foi compactado com o seu nome original que estava no BDOC. Como fazer isso?:

MemoryStream memoryStream = new MemoryStream();
            FileField.RetrieveContents(this, "ARQUIVORETORNO", memoryStream);  

            using (System.IO.FileStream compressedFileStream = System.IO.File.Create("teste.zip"))
            {
                using (System.IO.Compression.GZipStream zip = new System.IO.Compression.GZipStream(compressedFileStream, System.IO.Compression.CompressionMode.Compress))
                {
                    
                    memoryStream.CopyTo(zip);                   
                }

            }
Olá rodrigo.prandi, ajustei a resposta para tratar melhor a sua situação.
Deu certo João Paulo. Obrigado.

Perguntas relacionadas

+9 votos
1 resposta
+4 votos
1 resposta
+6 votos
1 resposta
+8 votos
1 resposta
perguntado 3 Jun, 2014 por renan.fagundes (40 pontos) | 44 visitas
Melhores Apr 2026
  1. CeceliaWysel

    5 Pontos

  2. VernonSchaw

    5 Pontos

  3. MargieOsterh

    5 Pontos

200 pontos
Melhores 2026 Apr 06 - 12
  1. danilo.pereira

    96 Pontos

  2. danilo.pereira

    96 Pontos

  3. danilo.pereira

    96 Pontos

  4. willian.metalsystem

    69 Pontos

  5. henrique.muller

    62 Pontos

  6. luciano.fronza

    61 Pontos

  7. luciano.fronza

    61 Pontos

  8. luciano.fronza

    61 Pontos

  9. diuari.molinari

    52 Pontos

  10. diuari.molinari

    51 Pontos

518 perguntas
567 respostas
389 comentários
772 usuários