Ich versuche, ein ZIP-Archiv mit einer einfachen Demo-Textdatei MemoryStream
wie folgt zu erstellen :
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);
}
}
Wenn ich diesen Code ausführe, wird die Archivdatei selbst erstellt, foo.txt jedoch nicht.
Wenn ich das jedoch MemoryStream
direkt durch den Dateistream ersetze , wird das Archiv korrekt erstellt:
using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
using (var archive = new ZipArchive(fileStream, FileMode.Create))
{
// ...
}
Ist es möglich, mit a MemoryStream
das ZIP-Archiv ohne das zu erstellen FileStream
?
c#
.net
zip
compression
ziparchive
Marius Schulz
quelle
quelle
using
für dasentry.Open
, nur eine Vermutung.Antworten:
Dank https://stackoverflow.com/a/12350106/222748 habe ich:
Wir müssen also dispose auf ZipArchive aufrufen, bevor wir es verwenden können. Dies bedeutet, dass 'true' als dritter Parameter an ZipArchive übergeben wird, damit wir nach dem Entsorgen weiterhin auf den Stream zugreifen können.
quelle
Nur eine andere Version des Zippens, ohne eine Datei zu schreiben.
quelle
Setzen Sie die Position des Streams auf 0, bevor Sie ihn in den Zip-Stream kopieren.
quelle
Arbeitslösung für MVC
quelle
Controller.File
Methode hat eine Überladung, die akzeptiertStream
. Verwenden Sie dies, um zu vermeiden, dass eine weitere Kopie einer ZIP-Datei im Speicher erstellt wird.Sie müssen den Speicherstrom fertig schreiben und dann den Puffer zurücklesen.
quelle
quelle
Auf diese Weise können Sie eine Entität in eine XML-Datei konvertieren und anschließend komprimieren:
}}
quelle
Funktion zum Zurückgeben von Streams, die eine Zip-Datei enthalten
Wenn Sie möchten, schreiben Sie zip in den Dateistream.
`
quelle
byteArray
und einmal in derZipArchive
. Ganz zu schweigen davon, dass Sie keine Dateien in den Speicher laden müssen. Verwenden Sie Streaming, wie in allen anderen vorhandenen Antworten gezeigt.quelle