Изграждането на 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# приложения.

More in this category