Hafızada bir ZIP oluşturmak, bir indirmeyi aktarmanız gerektiğinde yararlıdır, byteyi başka bir hizmette geçmeniz veya dokunmatik bir disk olmadan bir veritabanında bir arşiv depolamanız gerekir. Aspose.ZIP for .NET akışlar kullanılarak zIP dosyalarını yaratmak için temiz bir API sergilemektedir, kompresyon ayarlarını seçin ve sonuçları kaydedin. MemoryStream veya doğrudan HTTP yanıtına.

Bu kılavuz, bir konsol uygulamasına veya ASP.NET Core projesine yerleştirebileceğiniz tam ve doğru kodu sağlar.

Ön koşullar

  • .NET 6 veya sonraki
  • Nükleer : Aspose.Zip
dotnet add package Aspose.Zip

Kullanılan isimler :

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

Hızlı Başlangıç: ZIP tamamen hafızada oluşturun

Bu örnek, bir çubuktan ve diske bir dosyadan girişler eklenir, arşivi bir MemoryStreamSonuç olarak, bit array’ı ortaya çıkarır.

// 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");
    }
}
  • Anahtar Noktalar *
  • new Archive() boş bir zip oluşturur.
  • CreateEntry(entryName, stream, entrySettings) Bir dosyayı her okunabilir akım‘dan ekler.
  • archive.Save(stream) Arşivi seçtiğiniz akışınıza yazın ( hafıza, ağ, yanıt vücudu).

Temp dosyalarını yazmadan tüm bir klasör ağaç ekleyin

Bir dizin tekrarlayarak yürüyün, nispeten yolları koruyun ve son arşivi hafızaya yazın.

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: disk I/O olmadan bir ZIP indirme akışı

Bu son nokta, bir ZIP’yi birden fazla kaynaktan hafızada oluşturur ve doğru içerik türü ve bir indirme dosya adı ile geri getirir.

// 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();

“Neden buraya gidiyorsun?”Minimum API’ler belirli bir ödeme yükü gerektirir. çok büyük arşivler için, doğrudan aktarmayı tercih edin 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);
});

Kompresyon ayarlarını seçin

DeflateCompressionSettings Hız vs Boyut kontrolü:

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

ayarları üzerinden geçin new ArchiveEntrySettings(deflate) İhtiyaç duyulduğunda girişlere göre ayarları karıştırabilirsiniz.

Akımlardan girişleri güvenli bir şekilde ekle

  • Kullanımı File.OpenRead(path) Büyük dosyaları tamamen hafıza içine yüklemeden aktarmak.
  • Üretilen içerik için, bir MemoryStream ya da a PipeWriter-Destek akışı ve geçmek için CreateEntry.
  • Herkesin arkasında akışlar var CreateEntry Hızlı bir şekilde serbest bırakın.

Büyük üretilen içerik için bir örnek:

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);
}

Doğrulama ve hata işleme

  • Dosyaya eklemeden önce girişleri kontrol edin.
  • Yaratıcılığın içine girin try/catch Ve web APIs için açık bir HTTP hatası iade.
  • Önceki İçerikKıbrıs’ta Yürüyüş Yolları (/• Araçlardaki tutarlı davranışlar.

performans kontrol listesi

  • Choose CompressionLevel.Low Gerçek zamanlı indirme için, hız büyüklüğünden daha fazlası olduğunda.
  • Toplam yükleme girişleri tamamen RAM; dosyaların veya ağ akışlarından akışı önleyin.
  • Çok büyük multi-GB arşivler için, doğrudan aktarın HttpResponse.Body veya buffer yerine başka bir hedef akışı.
  • Dispose Archive Ve tüm girişler belirleyici olarak akıyor.

FAQ Hakkında

  • Hafıza içindeki ZIP’i şifre ile koruyabilir miyim?Aspose.ZIP şifreli ZIP dosyalarını destekler. TraditionalEncryptionSettings veya AesEncryptionSettings yolda ArchiveEntrySettings* İletişim çağrısı sırasında başvuru CreateEntry.

** Hatıralarımda yüklediğim mevcut ZIP’yi güncelleyebilir miyim?**Evet, bir yere yerleştirin Archive, ekleme veya kaldırma girişleri, sonra Save Bir akışa geri dönelim.

**Bu, Azure App Service veya konteynerlerde çalışıyor mu?**Evet. hafıza ve akışlı zipping, disk erişimi sınırlı olduğu kum kutusu ortamlarında iyi çalışır.

Özetle

Aspose.ZIP for .NET ile tamamen hafızada bir ZIP arşivi oluşturdunuz, akışlardan girişler eklediniz, sıkıştırma ayarlandı ve geçici dosyalar olmaksızın ASP.NET Core son noktasından dosyayı iade ettiniz. bu desenleri kullanarak C# uygulamalarınızda indirme, paketler ve ihracatlar üretebilirsiniz.

More in this category