Próbuję utworzyć archiwum ZIP z prostym plikiem tekstowym demonstracyjnym, używając w MemoryStream
następujący sposób:
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);
}
}
Jeśli uruchomię ten kod, sam plik archiwum zostanie utworzony, ale foo.txt nie.
Jeśli jednak zamienię MemoryStream
bezpośrednio na strumień plików, archiwum zostanie utworzone poprawnie:
using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
using (var archive = new ZipArchive(fileStream, FileMode.Create))
{
// ...
}
Czy można użyć MemoryStream
do tworzenia archiwum ZIP bez FileStream
?
c#
.net
zip
compression
ziparchive
Marius Schulz
źródło
źródło
using
dlaentry.Open
, tylko zgadywanie.Odpowiedzi:
Dzięki https://stackoverflow.com/a/12350106/222748 otrzymałem:
Musimy więc wywołać dispose na ZipArchive, zanim będziemy mogli go użyć, co oznacza przekazanie „true” jako trzeciego parametru do ZipArchive, abyśmy nadal mogli uzyskać dostęp do strumienia po jego usunięciu.
źródło
Po prostu kolejna wersja kompresowania bez zapisywania żadnego pliku.
źródło
Ustaw pozycję strumienia na 0 przed skopiowaniem go do strumienia ZIP.
źródło
Rozwiązanie robocze dla MVC
źródło
Controller.File
Sposób ma przeciążenia, który akceptujeStream
. Użyj tego, aby uniknąć tworzenia kolejnej kopii pliku ZIP w pamięci.Musisz zakończyć zapisywanie strumienia pamięci, a następnie ponownie odczytać bufor.
źródło
źródło
Oto sposób na przekonwertowanie jednostki do pliku XML, a następnie skompresowanie go:
}
źródło
Funkcja zwracająca strumień zawierający plik zip
Jeśli chcesz, napisz zip do strumienia plików.
`
źródło
byteArray
i raz wZipArchive
. Nie wspominając o tym, że nie musisz w ogóle ładować plików do pamięci. Użyj transmisji strumieniowej, jak pokazano we wszystkich innych istniejących odpowiedziach.źródło