ساخت یک ZIP در حافظه مفید است هنگامی که شما نیاز به پخش یک دانلود، انتقال بایت ها به یک سرویس دیگر، و یا ذخیره یک آرشیو در یک پایگاه داده بدون لمس دیسک. Aspose.ZIP برای .NET یک 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) آرشیو را در جریان انتخابی خود بنویسید (حافظه، شبکه، بدن پاسخ).

اضافه کردن یک درخت کل پوشه بدون نوشتن فایل های temp

یک دایرکتوری را تکرار کنید، مسیرهای نسبی را حفظ کنید و آرشیو نهایی را به حافظه بنویسید.

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: پخش یک دانلود ZIP بدون دیسک I/O

این نقطه نهایی یک 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) برای پخش فایل های بزرگ بدون بارگذاری کامل آنها به حافظه.
  • برای محتوای تولید شده، به یک 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 و بازگرداندن یک خطای واضح HTTP برای API های وب.
  • (تغییرمسیر در مسیرهای پیش رو)/برای رفتار مداوم در سراسر ابزارها

بررسی عملکرد

  • Choose CompressionLevel.Low برای دانلود در زمان واقعی زمانی که سرعت بیشتر از اندازه مهم است.
  • اجتناب از بارگذاری ورودی های بزرگ به طور کامل به RAM؛ جریان از فایل ها و یا جریان های شبکه.
  • برای فایل های چند گیگابایت بسیار بزرگ، به طور مستقیم به HttpResponse.Body یا یک جریان هدف دیگر به جای بوفری.
  • Dispose Archive و همه واردات به صورت تعیین کننده جریان می یابد.

FAQ

**آیا می توانم رمز عبور را در حافظه ZIP محافظت کنم؟**Aspose.ZIP از فایل های رمزگذاری شده ZIP پشتیبانی می کند. TraditionalEncryptionSettings یا AesEncryptionSettings از طریق ArchiveEntrySettingsدرخواست برای ورود در هنگام تماس CreateEntry.

**آیا می توانم یک ZIP موجود را که در حافظه بارگذاری کرده ام، به روز کنم؟**بله، آن را در یک Archive, اضافه کردن یا حذف ورودی ها , سپس Save بازگشت به جریان

**آیا این کار در سرویس برنامه های Azure یا کانتینرها انجام می شود؟**در حافظه و جریان زپینگ به خوبی در محیط های شن و ماسه ای کار می کند که در آن دسترسی به دیسک محدود است.

خلاصه

شما یک آرشیو ZIP به طور کامل در حافظه با Aspose.ZIP برای .NET، اضافه کردن ورودی از جریان ها، تنظیم فشرده سازی، و بازگرداندن اسناد از یک نقطه نهایی ASP.NET Core بدون فایل های موقت.

More in this category