Estou tentando criar um arquivo ZIP com um simples arquivo de texto de demonstração usando o MemoryStream
seguinte:
using (var memoryStream = new MemoryStream())
using (var archive = new ZipArchive(memoryStream , ZipArchiveMode.Create))
{
var demoFile = archive.CreateEntry("foo.txt");
using (var entryStream = demoFile.Open())
using (var streamWriter = new StreamWriter(entryStream))
{
streamWriter.Write("Bar!");
}
using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
{
stream.CopyTo(fileStream);
}
}
Se eu executar esse código, o próprio arquivo morto será criado, mas foo.txt não.
No entanto, se eu substituir MemoryStream
diretamente pelo fluxo de arquivos, o arquivo morto será criado corretamente:
using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
using (var archive = new ZipArchive(fileStream, FileMode.Create))
{
// ...
}
É possível usar a MemoryStream
para criar o arquivo ZIP sem o FileStream
?
c#
.net
zip
compression
ziparchive
Marius Schulz
fonte
fonte
using
para oentry.Open
, apenas um palpite.Respostas:
Graças a https://stackoverflow.com/a/12350106/222748 , obtive:
Portanto, precisamos chamar o descarte no ZipArchive antes de poder usá-lo, o que significa passar 'true' como o terceiro parâmetro para o ZipArchive, para que ainda possamos acessar o fluxo depois de descartá-lo.
fonte
Apenas outra versão do zipar sem gravar nenhum arquivo.
fonte
Defina a posição do fluxo como 0 antes de copiá-lo para o fluxo zip.
fonte
Solução de trabalho para MVC
fonte
Controller.File
método tem uma sobrecarga que aceitaStream
. Use isso para evitar a criação de outra cópia de um arquivo ZIP na memória.Você precisa terminar de escrever o fluxo de memória e ler o buffer novamente.
fonte
fonte
Esta é a maneira de converter uma entidade em arquivo XML e compactá-la:
}
fonte
Função para retornar fluxo que contém arquivo zip
Se desejar, escreva zip no fluxo de arquivos.
`
fonte
byteArray
e uma vez naZipArchive
. Sem mencionar que você não precisa carregar arquivos na memória. Use o streaming, como mostrado em todas as outras respostas existentes.fonte