+6 votos
47 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) | 47 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 May 2020
  1. henrique.muller

    18 Pontos

  2. joao.melo

    14 Pontos

  3. joseglauber

    11 Pontos

  4. SlimShady

    7 Pontos

  5. willian.metalsystem

    6 Pontos

  6. lucas.melo

    3 Pontos

  7. fluipress.luciano

    2 Pontos

  8. pajucara.wallacef

    2 Pontos

  9. jean.filho

    2 Pontos

  10. maicon.pereira

    2 Pontos

200 pontos
Melhores 2020 May 25 - 31
    433 perguntas
    476 respostas
    346 comentários
    466 usuários