Изграждането на ZIP в паметта е полезно, когато трябва да предавате изтегляне, да прехвърляте байтове на друга услуга или да съхранявате архив в база данни, без да докосвате диска. Aspose.ZIP for .NET излага чист API за създаване на ZIP архиви с помощта на потоци, изберете настройки за компресиране и запишете резултата в MemoryStream или директно към HTTP отговора.
Това ръководство предоставя пълен, правилния код, който можете да поставите в приложение за конзола или проект ASP.NET Core.
Предпоставки
- .NET 6 или по-късно
- НУГЕТ :
Aspose.Zip
dotnet add package Aspose.Zip
Използвани имена:
using Aspose.Zip; // Archive, ArchiveEntry
using Aspose.Zip.Saving; // DeflateCompressionSettings, CompressionLevel
Бързо стартиране: създаване на ZIP изцяло в паметта
Този пример добавя записи от string и файл на диск, записва архива в MemoryStream,И да се изчисти изходният батерия.
// File: Program.cs
using System;
using System.IO;
using System.Text;
using Aspose.Zip;
using Aspose.Zip.Saving;
class Program
{
static void Main()
{
// Prepare output buffer
using var zipBuffer = new MemoryStream();
// Choose compression (Deflate is the standard ZIP method)
var deflate = new DeflateCompressionSettings();
var entrySettings = new ArchiveEntrySettings(deflate);
using (var archive = new Archive())
{
// 1) Add a text file from memory
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("Hello from Aspose.ZIP in memory.")))
{
archive.CreateEntry("docs/readme.txt", ms, entrySettings);
}
// 2) Add a file from disk (streamed; not fully loaded in RAM)
var sourcePath = "report.pdf"; // ensure it exists
if (File.Exists(sourcePath))
{
using var fs = File.OpenRead(sourcePath);
archive.CreateEntry("reports/2025/report.pdf", fs, entrySettings);
}
// 3) Save the ZIP to our in-memory buffer
archive.Save(zipBuffer);
}
// Use the ZIP bytes as needed (send over network, write to DB, etc.)
byte[] zipBytes = zipBuffer.ToArray();
Console.WriteLine($"ZIP size: {zipBytes.Length} bytes");
}
}
Ключови точки
new Archive()Създаване на празен ZIP.CreateEntry(entryName, stream, entrySettings)Добавете файл от Всеки прочетен поток.archive.Save(stream)записва архива в избрания от вас поток (памет, мрежа, тялото на отговора).
Добавяне на цяло дърво на папки без да се пишат файлове с темп
Разходете се рекурсивно в директория, запазете относителните пътища и напишете окончателния архив в паметта.
using System.IO;
using Aspose.Zip;
using Aspose.Zip.Saving;
static class InMemoryZipper
{
public static byte[] ZipFolderToBytes(string sourceFolder)
{
if (!Directory.Exists(sourceFolder))
throw new DirectoryNotFoundException(sourceFolder);
var deflate = new DeflateCompressionSettings();
var entrySettings = new ArchiveEntrySettings(deflate);
using var buffer = new MemoryStream();
using (var archive = new Archive())
{
var root = Path.GetFullPath(sourceFolder);
foreach (var filePath in Directory.GetFiles(root, "*", SearchOption.AllDirectories))
{
var rel = Path.GetRelativePath(root, filePath).Replace(Path.DirectorySeparatorChar, '/');
using var fs = File.OpenRead(filePath);
archive.CreateEntry(rel, fs, entrySettings);
}
archive.Save(buffer);
}
return buffer.ToArray();
}
}
ASP.NET Core: Изтегляне на ZIP без I/O на диск
Този крайно място създава ZIP в паметта от няколко източника и го връща с правилния тип съдържание и име на файла за изтегляне.
using System;
using System.IO;
using System.Text;
using Aspose.Zip;
using Aspose.Zip.Saving;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/download-zip", () =>
{
using var buffer = new MemoryStream();
var deflate = new DeflateCompressionSettings();
var settings = new ArchiveEntrySettings(deflate);
using (var archive = new Archive())
{
var ms = new MemoryStream(Encoding.UTF8.GetBytes("id,name\n1,Alice\n2,Bob\n"));
archive.CreateEntry("data/users.csv", ms, settings);
var logo = "wwwroot/logo.png";
if (File.Exists(logo))
{
using var fs = File.OpenRead(logo);
archive.CreateEntry("assets/logo.png", fs, settings);
}
archive.Save(buffer);
ms.Dispose();
}
buffer.Position = 0;
return Results.File(
fileContents: buffer.ToArray(),
contentType: "application/zip",
fileDownloadName: $"bundle-{DateTime.UtcNow:yyyyMMdd-HHmmss}.zip");
});
await app.StartAsync();
await app.StopAsync();
Console.WriteLine("ASP.NET app validated.");
Защо ToArray() тук ли? Минималните API изискват конкретна полезна тежест. За много големи архиви предпочитате да стриймирате директно към HttpResponse.Body:
app.MapGet("/stream-zip", async (HttpContext ctx) =>
{
ctx.Response.ContentType = "application/zip";
ctx.Response.Headers.ContentDisposition = $"attachment; filename=\"bundle.zip\"";
var deflate = new DeflateCompressionSettings(CompressionLevel.Normal);
var settings = new ArchiveEntrySettings(deflate);
using var archive = new Archive();
// Add entries...
using var ms = new MemoryStream(Encoding.UTF8.GetBytes("hello"));
archive.CreateEntry("hello.txt", ms, settings);
// Stream directly to the client without buffering full ZIP in RAM
await archive.SaveAsync(ctx.Response.Body);
});
Изберете настройки за компресия
DeflateCompressionSettings Контрол на скоростта срещу размера:
using Aspose.Zip.Saving;
var fastest = new DeflateCompressionSettings(); // fastest, larger files
var balanced = new DeflateCompressionSettings(); // default balance
var smallest = new DeflateCompressionSettings(); // slowest, smallest files
Преминаване на настройките чрез new ArchiveEntrySettings(deflate) Когато създавате записи, можете да смесвате настройки за всеки запис, ако е необходимо.
Добавяне на записи от потока безопасно
- Използвайте
File.OpenRead(path)За да прехвърлите големи файлове, без да ги зареждате напълно в паметта. - За генерирано съдържание, напишете на
MemoryStreamили аPipeWriter- поддържано поток и го прехвърля наCreateEntry. - Изчистете порите след всяко
CreateEntryСвободни ресурси бързо.
Пример за генерирано съдържание:
using System.IO;
using Aspose.Zip;
using Aspose.Zip.Saving;
static void AddLargeGeneratedEntry(Archive archive, string name)
{
// simulate a big stream produced incrementally
using var temp = new FileStream(Path.GetTempFileName(), FileMode.Create, FileAccess.ReadWrite, FileShare.None, 81920, FileOptions.DeleteOnClose);
using var writer = new StreamWriter(temp);
for (int i = 0; i < 200_000; i++) writer.WriteLine($"row-{i},value-{i}");
writer.Flush();
temp.Position = 0;
var settings = new ArchiveEntrySettings(new DeflateCompressionSettings());
archive.CreateEntry(name, temp, settings);
}
Валидиране и обработка на грешки
- Проверете дали въведенията съществуват, преди да ги добавите към архива.
- Създаване на въже в
try/catchи връща ясна HTTP грешка за уеб API. - Входни линии с предни релси (
/- за последователно поведение в различните инструменти.
Проверка на изпълнението
- Изберете
CompressionLevel.LowЗа изтегляне в реално време, когато скоростта е по-важна от размера. - Избягвайте зареждането на масивни записи напълно в RAM; поток от файлове или мрежови потоци.
- За много големи мулти-GB архиви, изтегляне директно до
HttpResponse.Bodyили друг целеви поток вместо буфер. - разпорежда
ArchiveВсички входящи потоци се определят детерминистично.
FAQ
Мога ли да защитя с парола ZIP в паметта? Aspose.ZIP supports encrypted ZIP archives. Use TraditionalEncryptionSettings или AesEncryptionSettings чрез ArchiveEntrySettings.Заявка за влизане при обаждане CreateEntry.
Мога ли да актуализирам съществуващ ZIP, който съм заредил в паметта? Да. Заредете го в Archive,добавяне или премахване на записи, след което Save Обратно към Поток.
Работи ли това в Azure App Service или в контейнери? Да. В паметта и поточното ципиране работят добре в среда с пясъчни кутии, където достъпът до диска е ограничен.
Резюме
Създаване на ZIP архив Напълно в паметта с Aspose.ZIP for .NET, добави записи от потоци, коригира компресията и върна архива от ASP.NET Core е Използвайте тези модели, за да генерирате изтегляния, опаковки и експорти ефективно в вашите C# приложения.