إنشاء ZIP في الذاكرة مفيد عندما تحتاج إلى بث تحميل، أو تمرير البايتات إلى خدمة أخرى، أو تخزين أرشيف في قاعدة بيانات دون لمس القرص. Aspose.ZIP for .NET يُظهر واجهة برمجة تطبيقات نظيفة لإنشاء أرشيفات 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 دون عمليات إدخال/إخراج على القرص
تنشئ هذه النقطة النهاية 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() هنا؟? تتطلب واجهات برمجة التطبيقات البسيطة حمولة ملموسة. بالنسبة للأرشيفات الكبيرة جدًا، يفضَّل البث مباشرة إلى 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 واضح لواجهات برمجة الويب. - قم بتطبيع مسارات الإدخال باستخدام الشرطات المائلة للأمام (
/) لضمان سلوك متسق عبر الأدوات.
قائمة التحقق من الأداء
- اختر
CompressionLevel.Lowللتنزيلات الفورية عندما تكون السرعة أهم من الحجم. - تجنب تحميل الإدخالات الضخمة بالكامل في الذاكرة؛ قم بالبث من الملفات أو تدفقات الشبكة.
- بالنسبة للأرشيفات الضخمة متعددة الجيجابايت، قم ببثها مباشرة إلى
HttpResponse.Bodyأو تدفق هدف آخر بدلاً من التخزين المؤقت. - تحرير
Archiveوكل تدفقات الإدخال بشكل حتمي.
FAQ
هل يمكنني حماية ZIP في الذاكرة بكلمة مرور؟? Aspose.ZIP يدعم أرشيفات ZIP المشفرة. استخدم TraditionalEncryptionSettings أو AesEncryptionSettings عبر ArchiveEntrySettings. طبّق لكل إدخال عند الاستدعاء CreateEntry.
هل يمكنني تحديث ZIP موجود تم تحميله إلى الذاكرة؟? نعم. حمّله في Archive, أضف أو احذف الإدخالات، ثم Save العودة إلى تدفق.
هل يعمل هذا في Azure App Service أو الحاويات؟? نعم. In-memory و streamed zipping يعملان جيدًا في البيئات المعزولة حيث الوصول إلى القرص محدود.
الملخص
لقد أنشأت أرشيف ZIP كليًا في الذاكرة مع Aspose.ZIP for .NET, أضفت إدخالات من التدفقات، ضبطت الضغط، وأعدت الأرشيف من ASP.NET Core نقطة النهاية دون ملفات مؤقتة. استخدم هذه الأنماط لإنشاء التنزيلات والحزم والصادرات بكفاءة في تطبيقات C# الخاصة بك.