تنسيق 7z هو خيار شائع لضغط عالي النسبة والتوزيع. مع Aspose.ZIP for .NET,، يمكنك إنشاء أرشيفات 7z برمجيًا باستخدام واجهة برمجة تطبيقات بسيطة وعصرية. يشرح هذا الدليل مثالًا عمليًا بسيطًا ويضيف أنماطًا عملية للمشاريع الحقيقية، مثل إضافة ملفات من القرص، بث البيانات من الذاكرة، التحكم في أسماء الإدخالات والمجلدات داخل الأرشيف، ومعالجة الأخطاء الأساسية.

جميع عينات الشيفرة مدمجة ومستقلة.


المتطلبات المسبقة

  • .NET 6 أو أحدث
  • حزمة NuGet Aspose.Zip
dotnet add package Aspose.Zip

المساحات الاسمية المستخدمة في الأمثلة: Aspose.Zip, Aspose.Zip.SevenZip


بدء سريع: إنشاء أرشيف 7z مع بعض الملفات

هذا المثال البسيط ينشئ أرشيف 7z جديد في الذاكرة، يضيف مدخلين، ويحفظه على القرص.

// File: Program.cs
using System;
using System.IO;
using System.Text;
using Aspose.Zip.SevenZip;

class Program
{
    static void Main()
    {
        var outputPath = "example.7z";

        using (var archive = new SevenZipArchive())
        {
            // Add a text file from memory
            using (var ms = new MemoryStream(Encoding.UTF8.GetBytes("Hello 7z from Aspose.ZIP")))
            {
                archive.CreateEntry("docs/readme.txt", ms);
            }

            // Add a file from disk
            var sourceFile = "report.pdf"; // ensure this file exists
            if (File.Exists(sourceFile))
            {
                using var fs = File.OpenRead(sourceFile);
                archive.CreateEntry("reports/2025/report.pdf", fs);
            }

            // Save the 7z archive
            using var outStream = File.Create(outputPath);
            archive.Save(outStream);
        }

        Console.WriteLine("Saved 7z: " + Path.GetFullPath(outputPath));
    }
}

ما الذي يجب ملاحظته

  • SevenZipArchive يبدأ فارغًا، ثم تقوم بالاستدعاء CreateEntry(entryName, stream) لكل عنصر.
  • تحدد أسماء الإدخالات بنية المجلدات داخل الأرشيف، مثل docs/readme.txt.
  • يمكنك تمرير أي قابل للقراءة Stream,، وهو مفيد للبيانات التي تنشئها في الذاكرة.

إضافة شجرة مجلدات كاملة

استعرض دليلًا بشكل متكرر، احفظ هيكله النسبي داخل الأرشيف، واحفظه كـ .7z.

using System;
using System.IO;
using Aspose.Zip.SevenZip;

static class FolderTo7z
{
    public static void CreateFromFolder(string sourceDir, string output7z)
    {
        if (!Directory.Exists(sourceDir))
            throw new DirectoryNotFoundException(sourceDir);

        using var archive = new SevenZipArchive();

        var basePath = Path.GetFullPath(sourceDir);
        foreach (var filePath in Directory.GetFiles(basePath, "*", SearchOption.AllDirectories))
        {
            var relPath = Path.GetRelativePath(basePath, filePath)
                              .Replace(Path.DirectorySeparatorChar, '/'); // normalize to forward slashes

            using var fs = File.OpenRead(filePath);
            archive.CreateEntry(relPath, fs);
        }

        using var outStream = File.Create(output7z);
        archive.Save(outStream);
    }
}

// Usage
// FolderTo7z.CreateFromFolder(@Path.Combine("C:", "data", "input"), "bundle.7z");

نصائح

  • استخدم Path.GetRelativePath للحفاظ على تنظيم المجلدات الداخلية نظيفًا.
  • قم بتطبيع فواصل المسار إلى شرطات مائلة للأمام لضمان اتساق مدخلات الأرشيف.

بث الملفات الكبيرة بأمان

عند إضافة ملفات كبيرة، قم ببثها بدلاً من تخزين كامل الملف في الذاكرة. النمط الأساسي أعلاه مع File.OpenRead يُبث بالفعل. إذا قمت بإنشاء المحتوى في الوقت الفعلي، اكتبّه إلى Stream ومرّر ذلك التدفق مباشرةً إلى CreateEntry.

using System.IO;
using System.Text;
using Aspose.Zip.SevenZip;

static void AddGeneratedCsv(SevenZipArchive archive, string entryName)
{
    // Example generator that writes CSV rows in a forward-only fashion
    using var pipe = new MemoryStream();
    using var writer = new StreamWriter(pipe, Encoding.UTF8, leaveOpen: true);

    writer.WriteLine("id,name");
    for (int i = 1; i <= 1000; i++)
        writer.WriteLine($"{i},Item {i}");

    writer.Flush();
    pipe.Position = 0;

    archive.CreateEntry(entryName, pipe);
}

نظّم الإدخالات باستخدام مساعد

للمهام الأكبر، استخدم مساعدًا صغيرًا لإضافة الملفات ببادئة مشتركة. هذا يحافظ على بنية الأرشيف متوقعة.

using System.IO;
using Aspose.Zip.SevenZip;

static class SevenZipHelpers
{
    public static void AddFile(SevenZipArchive archive, string rootPrefix, string fullPath)
    {
        var relName = Path.Combine(rootPrefix, Path.GetFileName(fullPath))
                           .Replace(Path.DirectorySeparatorChar, '/');
        using var fs = File.OpenRead(fullPath);
        archive.CreateEntry(relName, fs);
    }
}

مثال شامل من البداية إلى النهاية مع التسجيل والتحقق الأساسي

هذا المثال ينشئ أرشيف 7z من قائمة مختلطة من المصادر. يتحقق من صحة المسارات ويسجل النتائج.

// File: BuildArchive.cs
using System;
using System.Collections.Generic;
using System.IO;
using Aspose.Zip.SevenZip;

public static class BuildArchive
{
    public static bool Run(IEnumerable<string> paths, string output7z)
    {
        if (paths == null) throw new ArgumentNullException(nameof(paths));
        Directory.CreateDirectory(Path.GetDirectoryName(Path.GetFullPath(output7z)) ?? ".");

        int added = 0, skipped = 0;

        using var archive = new SevenZipArchive();

        foreach (var p in paths)
        {
            if (string.IsNullOrWhiteSpace(p)) { skipped++; continue; }

            if (File.Exists(p))
            {
                using var fs = File.OpenRead(p);
                var entryName = Path.GetFileName(p);
                archive.CreateEntry(entryName, fs);
                Console.WriteLine("Added file: " + entryName);
                added++;
            }
            else if (Directory.Exists(p))
            {
                var basePath = Path.GetFullPath(p);
                foreach (var fp in Directory.GetFiles(basePath, "*", SearchOption.AllDirectories))
                {
                    var rel = Path.GetRelativePath(basePath, fp).Replace(Path.DirectorySeparatorChar, '/');
                    using var fs = File.OpenRead(fp);
                    archive.CreateEntry(rel, fs);
                    Console.WriteLine("Added: " + rel);
                    added++;
                }
            }
            else
            {
                Console.WriteLine("Skip missing: " + p);
                skipped++;
            }
        }

        using var outStream = File.Create(output7z);
        archive.Save(outStream);

        Console.WriteLine($"Saved: {Path.GetFullPath(output7z)}");
        Console.WriteLine($"Entries added: {added}, skipped: {skipped}");
        return added > 0;
    }
}

// Usage sample:
// BuildArchive.Run(new [] { "README.md", "assets", "docs/spec.pdf" }, "release.7z");

أفضل الممارسات

  • استخدم الشرط المائل للأمام لأسماء الإدخالات تظهر العديد من الأدوات المسارات بشكل أكثر اتساقًا عندما تستخدم الإدخالات / كفاصل.
  • تخلص من التدفقات دائمًا غلف تدفقات الملفات في using الكتل. العينات أعلاه تضمن التخلص النظيف.
  • تحقق من صحة المدخلات تحقق من وجود الملفات قبل إضافتها. قدم سجلات واضحة للمسارات التي تم تخطيها.
  • حافظ على بنية الأرشيف نظيفة حدد اسم مجلد جذري داخل الأرشيف والتزم به، مثل app/ أو package/.
  • اختبر على المنصات المستهدفة تحقق من أن ملف 7z يفتح بشكل صحيح في الأدوات التي يعتمد عليها المستخدمون.

ملخص

قمت بإنشاء أرشيف 7z برمجيًا باستخدام Aspose.ZIP for .NET, أضفت ملفات من القرص والذاكرة، حافظت على بنية مجلد نظيفة، وحفظت النتيجة إلى .7z. استخدم هذه الأنماط لتعبئة الإصدارات والحزم والصادرات مباشرةً من تطبيقات C# الخاصة بك.

More in this category