+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 Aug 2025
    200 pontos
    Melhores 2025 Jul 28 - Aug 03
    1. Larson

      156 Pontos

    2. danilo.pereira

      96 Pontos

    3. danilo.pereira

      96 Pontos

    4. danilo.pereira

      96 Pontos

    5. luciano.fronza

      61 Pontos

    6. luciano.fronza

      61 Pontos

    7. luciano.fronza

      61 Pontos

    8. diuari.molinari

      52 Pontos

    9. diuari.molinari

      51 Pontos

    10. diuari.molinari

      51 Pontos

    517 perguntas
    566 respostas
    389 comentários
    704 usuários