Създаването на ZIP в паметта е полезно, когато трябва да стриймвате изтегляне, предавате байтове към друга услуга или съхранявате архив в база данни, без да докосвате диска. Aspose.ZIP for .NET предоставя чист API за създаване на ZIP архиви чрез потоци, избор на настройки за компресия и запазване на резултата в MemoryStream или директно в HTTP отговора.

Това ръководство предоставя пълен, коректен код, който можете да поставите в конзолно приложение или проект ASP.NET Core.


Предпоставки

  • .NET 6 или по-нов
  • NuGet: Aspose.Zip
dotnet add package Aspose.Zip

Използвани пространства от имена:

using Aspose.Zip;                 // Archive, ArchiveEntry
using Aspose.Zip.Saving;          // DeflateCompressionSettings, CompressionLevel

Бърз старт: създайте ZIP изцяло в паметта

Този пример добавя елементи от низ и файл на диска, запазва архива в 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
            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 = "archive.zip"; // ensure it exists
            if (File.Exists(sourcePath))
            {
                var fs = File.OpenRead(sourcePath);
                archive.CreateEntry("reports/2025/report.pdf", fs, entrySettings);
                // keep the stream open until after saving
                archive.Save(zipBuffer);
                fs.Dispose();
            }
            else
            {
                // Save when the file entry is not added
                archive.Save(zipBuffer);
            }

            ms.Dispose();
        }

        // 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() тук? Minimal APIs изискват конкретен payload. За много големи архиви, предпочитайте директно поточно предаване към 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);
});

Изберете настройки за компресия

Aspose.ZIP поддържа няколко алгоритъма за компресия. Всеки е отделен клас, наследен от CompressionSettings:

using Aspose.Zip.Saving;

var deflate = new DeflateCompressionSettings();         // standard ZIP Deflate — best compatibility
var bzip2   = new Bzip2CompressionSettings();           // better compression ratio, slower
var lzma    = new LzmaCompressionSettings();            // best compression ratio, slowest
var store   = new StoreCompressionSettings();           // no compression — fastest (for pre-compressed files)

// Use Deflate for standard ZIP compatibility:
var entrySettings = new ArchiveEntrySettings(deflate);

Предайте настройките чрез new ArchiveEntrySettings(compressionSettings) при създаване на записи. Можете да смесвате различни алгоритми за всеки запис — например, да съхранявате предварително компресирани изображения, докато компресирате текстови файлове с 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 поддържа криптирани ZIP архиви. Използвайте TraditionalEncryptionSettings или AesEncryptionSettings чрез ArchiveEntrySettings. Прилагайте за всеки елемент при извикване CreateEntry.

Мога ли да актуализирам съществуващ ZIP, който съм заредил в паметта? Да. Заредете го в Archive, добавете или премахнете записи, след това Save обратно към поток.

Работи ли това в Azure App Service или контейнери? Да. Компресирането в памет и чрез потоци работи добре в изолирани среди, където достъпът до диска е ограничен.


Обобщение

Създадохте ZIP архив изцяло в паметта с Aspose.ZIP for .NET, добавихте записи от потоци, настроихте компресията и върнахте архива от an ASP.NET Core крайна точка без временни файлове. Използвайте тези шаблони, за да генерирате изтегляния, пакети и експорти ефективно във вашите C# приложения.

More in this category