Wenn Foldername gefüllt ist, wird ein Verzeichnis erstellt, wo die Dateien reinkommen.
1 2 3 4 5 |
/// <summary> /// Das Dictionary wird iteriert und die Dateien darin gezippt. Der Key Value des Dictionarys entspricht der neuen Dateienbezeichnung /// Foldername ist das Verzeichnis, wo alle Dateien enthalten sind. Leeres Verzeichnis -> Dateien liegen lose im Zip Archiv /// </summary> /// <returns>Zip File</returns> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public static MemoryStream ZipFiles(IDictionary<string, FileInfo> files, string zipName, string Foldername = "") { if (!zipName.EndsWith(".zip")) { zipName += ".zip"; } var stream = new MemoryStream(); var zip = new ZipArchive(stream, ZipArchiveMode.Create, true); // Verzeichnis ins Archiv erstellen, wo darauf folgende Dateien rein kommen if (Foldername != string.Empty) { zip.CreateEntry(Foldername + "/"); } // Dateien, dem Archiv hinzufügen foreach (KeyValuePair<string, FileInfo> file in files) { // Zip Eintrag erzeugen ZipArchiveEntry entry = zip.CreateEntry(Foldername + "/" + file.Key, CompressionLevel.Optimal); // Zip Eintrag ins Memory schreiben using (var zipEntry = entry.Open()) using (var fileStream = new FileStream(file.Value.FullName, FileMode.Open, FileAccess.Read)) { fileStream.CopyTo(zipEntry); } } zip.Dispose(); stream.Seek(0, 0); return (stream.Length > 0) ? stream : null; } |
In Verbindung mit MVC kann der Stream nun Chunk-weise ausgegeben werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
System.IO.MemoryStream zipFile = getStream(); //Alternativ: result = File(zipFile, "application/zip", filename); Response.ClearHeaders(); Response.ClearContent(); Response.ContentType = "application/zip"; Response.CacheControl = "No-cache"; Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache); Response.AddHeader("Content-Length", zipFile.Length.ToString()); int chunkSize = 8192; byte[] buffer = new byte[chunkSize]; int offset = 0; int read = 0; using (var fs = zipFile) { while ((read = fs.Read(buffer, offset, chunkSize)) > 0) { if (!Response.IsClientConnected) break; Response.OutputStream.Write(buffer, 0, read); Response.Flush(); } } |
Login