إن بناء ZIP في الذاكرة مفيد عندما تحتاج إلى تدفق تنزيل أو نقل بايتات إلى خدمة أخرى أو تخزين أرشيف في قاعدة بيانات دون لمس القرص. Aspose.ZIP for .NET يعرض API نظيف لإنشاء ملفات Z IP باستخدام التدفقات، واختيار إعدادات الضغط، وحفظ النتيجة إلى 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 بالكامل في الذاكرة
هذا المثال يضيف إدخالات من شريط وملف على القرص، ويحفظ الأرشيف إلى 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();
**لماذا توراي() هنا؟**الحد الأدنى لـ APIs يتطلب عبء دفع ملموس.للأرشيفات الكبيرة جداً، يفضل البث مباشرة إلى 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
أو أ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 الواضح لـ Web APIs. - تداول الخيارات الثنائية مع التداول المباشر (
/
- السلوك المتسق بين الأدوات.
قائمة التحقق
- Choose
CompressionLevel.Low
للتحميلات في الوقت الحقيقي عندما يهم السرعة أكثر من الحجم. - تجنب تحميل الإدخالات الضخمة بالكامل في ذاكرة الوصول العشوائي؛ تدفق من الملفات أو تدابير الشبكة.
- لعدد كبير جدا من الأرشيفات متعددة غيغابايت، وتدفق مباشرة إلى
HttpResponse.Body
أو غيرها من التدفقات المستهدفة بدلاً من التفريغ. - Dispose
Archive
وتدفق جميع الإدخالات بشكل حاسم.
FAQ
** هل يمكنني حماية كلمة المرور في الذاكرة؟**Aspose.ZIP يدعم ملفات ZIP المشفرة. TraditionalEncryptionSettings
أو AesEncryptionSettings
من خلال ArchiveEntrySettings
التقدم بطلب عند الدخول CreateEntry
.
** هل يمكنني تحديث ZIP الحالي الذي قمت بتحميله إلى الذاكرة؟**نعم، قم بتحميلها في Archive
إضافة أو إزالة الإدخالات، ثم Save
العودة إلى تدفق.
**هل يعمل هذا في خدمة تطبيق Azure أو حاويات؟**نعم. في الذاكرة وتدفق زيبينغ يعمل بشكل جيد في البيئات الخرسانية حيث يتم الحد من الوصول إلى القرص.
ملخص
قمت بإنشاء أرشيف ZIP في الذاكرة الكاملة مع Aspose.ZIP for .NET، إضافة إدخالات من البث، وتعديل الضغط، وإرجاع الأرشيد من نقطة النهاية ASP.NET Core دون ملفات مؤقتة.