Erstellen Sie ein ZIP-Archiv in den Speicher Mit dem System.IO.Kompression
Ich versuche, erstellen Sie ein ZIP-Archiv mit einem einfachen demo-text-Datei mit einem MemoryStream
wie folgt:
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ühren, wird die Archiv-Datei selbst erstellt, aber foo.txt nicht.
Jedoch, wenn ich ersetzen Sie den MemoryStream
direkt mit der stream-Datei, das Archiv wird 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, eine MemoryStream
zu erstellen, das ZIP-Archiv ohne die FileStream
?
könnte es sein, etwas zu tun mit entsorgen? in Beispiel Sie das nicht tun
In diesem Fall, ich sollte bekommen haben, eine ObjectDisposedException oder zumindest eine leere Datei, sollte ich nicht?
Ihre Dateien-position geht an das Ende der Datei, so dass es nicht in der Lage ist, etwas zu schreiben, so dass, wenn Sie versuchen, zurücksetzen der position-Eigenschaft des stream 0 wird es funktionieren.
Veraltet.. (ich wusste nicht, über die "nicht entsorgen basestream" - option erwähnt, in der Antwort!)
F. Y. I.: braucht man mindestens .NET 4.5 .ZipArchive. Siehe Rick Strahl .NET 4.5 ist ein direktes Ersatz für .NET 4.0 ~~ siehe auch ich finde nicht "ZipFile" - Klasse in " - System.IO.Compression-namespace"
using
für die entry.Open
, nur eine Vermutung.In diesem Fall, ich sollte bekommen haben, eine ObjectDisposedException oder zumindest eine leere Datei, sollte ich nicht?
Ihre Dateien-position geht an das Ende der Datei, so dass es nicht in der Lage ist, etwas zu schreiben, so dass, wenn Sie versuchen, zurücksetzen der position-Eigenschaft des stream 0 wird es funktionieren.
Veraltet.. (ich wusste nicht, über die "nicht entsorgen basestream" - option erwähnt, in der Antwort!)
F. Y. I.: braucht man mindestens .NET 4.5 .ZipArchive. Siehe Rick Strahl .NET 4.5 ist ein direktes Ersatz für .NET 4.0 ~~ siehe auch ich finde nicht "ZipFile" - Klasse in " - System.IO.Compression-namespace"
InformationsquelleAutor Marius Schulz | 2013-06-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank https://stackoverflow.com/a/12350106/222748 ich habe:
Also müssen wir rufen Sie dispose auf ZipArchive, bevor wir ihn verwenden können, was bedeutet, dass die Weitergabe "true" als Dritten parameter für die ZipArchive so können wir immer noch Zugriff auf den stream nach der Entsorgung.
kannst du bitte etwas näher erläutern?
ZipArchive add Prüfsumme am Ende des Archivs zu bestimmen, Korruption oder ändern (Sicherheit ) . Also bis zum schließen archivieren oder entsorgen es , Prüfsumme nicht enthalten im stream . Ich hoffe, dass es erklären klar !
Können diese verwendet werden, um das Lesen von Dateien von einem ziparchive, die gestreamt wurde ? Zum Beispiel eine Datei gestreamt aus dem Netz ?
Von unschätzbarem Wert, genau wie alles gute, SO Antworten!
InformationsquelleAutor Michael
Nur eine andere version von komprimieren ohne das schreiben von Datei.
InformationsquelleAutor luci79rom
Legen Sie die position des Streams auf 0 vor dem kopieren in den zip-stream.
InformationsquelleAutor Mahesh
Müssen Sie fertig zu schreiben, die Speicher-stream, dann Lesen Sie den Puffer zurück.
InformationsquelleAutor Rattle
Funktionierende Lösung für MVC
Controller.File
Methode hat eine überladung, die akzeptiertStream
. Verwenden Sie, um zu vermeiden, noch eine weitere Kopie der ZIP-Datei in den Speicher.InformationsquelleAutor Debajit Mukhopadhyay
InformationsquelleAutor FAREH
Dies ist der Weg, um zu konvertieren eine Person zu XML-Datei und komprimieren Sie es:
}
InformationsquelleAutor luisfbn