+6 votos
77 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 (190 pontos) | 77 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 (224 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

+8 votos
1 resposta
+3 votos
1 resposta
+6 votos
1 resposta
+6 votos
2 respostas
Melhores Nov 2020
  1. kevin.katzer

    13 Pontos

  2. Cesar.Albuquerque

    11 Pontos

  3. diuari.molinari

    1 Pontos

200 pontos
Melhores 2020 Nov 23 - 29
    445 perguntas
    492 respostas
    351 comentários
    497 usuários