メモリに ZIP を構築することは、ダウンロードをストリーミングする必要がある場合、別のサービスにバイトを転送するか、タッチディスクなしにデータベースにアーカイブを保存する場合に役立ちます。 Aspose.ZIP for .NET は、流れを使用して Zip ファイルを作成するためのクリーン API が表示され、圧縮設定を選択し、結果を節約します。 MemoryStream あるいは直接HTTP対応に。

このガイドは、コンソールアプリまたはASP.NET コアプロジェクトに挿入できる完全で正しいコードを提供します。

原則

  • .NET 6 またはそれ以降
  • ニュージーランド: 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(CompressionLevel.Normal);
        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, CompressionLevel level = CompressionLevel.Normal)
    {
        if (!Directory.Exists(sourceFolder))
            throw new DirectoryNotFoundException(sourceFolder);

        var deflate = new DeflateCompressionSettings(level);
        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:ディスク I/O なしで ZIP ダウンロードをストリーミング

このエンドポイントは、複数のソースからメモリにZIPを構築し、正しいコンテンツタイプとダウンロードファイル名で返します。

// File: Program.cs (minimal API)
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(CompressionLevel.Normal);
    var settings = new ArchiveEntrySettings(deflate);

    using (var archive = new Archive())
    {
        // Add dynamic content (for example, a CSV generated on the fly)
        using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("id,name\n1,Alice\n2,Bob\n")))
            archive.CreateEntry("data/users.csv", ms, settings);

        // Add a static file from disk if available
        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);
    }

    buffer.Position = 0; // rewind for reading
    return Results.File(
        fileContents: buffer.ToArray(),
        contentType: "application/zip",
        fileDownloadName: $"bundle-{DateTime.UtcNow:yyyyMMdd-HHmmss}.zip");
});

app.Run();

「なんでここにトーアレイ(?)」最小の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 スピード対サイズ:

var fastest = new DeflateCompressionSettings(CompressionLevel.Low);      // fastest, larger files
var balanced = new DeflateCompressionSettings(CompressionLevel.Normal);  // default balance
var smallest = new DeflateCompressionSettings(CompressionLevel.High);    // slowest, smallest files

設定を通して new ArchiveEntrySettings(deflate) エントリーを作成する際には、必要に応じて入力ごとに設定を混ぜることができます。

ストリームからエントリーを安全に追加

  • 利用 File.OpenRead(path) メモリに完全にアップロードせずに大きなファイルをストリーミングする。
  • 生成されたコンテンツについては、Aに書いてください。 MemoryStream あるいはA 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(CompressionLevel.Normal));
    archive.CreateEntry(name, temp, settings);
}

認証とエラー処理

  • アーカイブに追加する前に入力をチェックします。
  • クリエイティブ・イン try/catch そして、Web API のための明確な HTTP エラーを返します。
  • トップページ > トラックバック一覧(/ツールを通じて一貫した行動をとる。

パフォーマンスチェックリスト

  • Choose CompressionLevel.Low リアルタイムのダウンロードでは、スピードはサイズよりも重要です。
  • 大量のエントリーを完全にRAMに充電するのを避け、ファイルやネットワークストリームから流れ出します。
  • 非常に大きい複数のGBのアーカイブの場合、直接ストリーミング HttpResponse.Body また、ターゲットストリームではなくバッファー。
  • Dispose Archive すべての入力は決定的に流れています。

FAQ

** パスワードでZIPを保護できますか?**Aspose.ZIP は暗号化された ZIP アーカイブをサポートします。 TraditionalEncryptionSettings または AesEncryptionSettings 経由 ArchiveEntrySettings入場時に応募 CreateEntry.

**私が記憶に載せた既存のZIPを更新できますか?**いいえ! 入り込む Archiveエントリーを追加または削除すると、 Save 流れに戻る。

**これはAzure App Serviceまたはコンテナで動作しますか?**メモリとストリーミングのジッピングは、ディスクアクセスが制限されているサンドボックス環境でうまく機能します。

概要

メモリに完全に ZIP アーカイブを作成した Aspose.ZIP for .NET、ストリームからエントリーを追加し、カスタマイズされた圧縮、および一時的なファイルなしの ASP.NET Core エンドポイントからファイルを返します。

More in this category