في كثير من الأحيان ، تحصل على أرشيف ZIP يحتوي على أرشيفات ZIP أخرى بداخله مكونة بنية متداخلة من الأرشيفات. في مثل هذه الحالات ، قد ترغب في الحصول على بنية مسطحة عن طريق استخراج جميع أرشيفات ZIP الداخلية في الأرشيف الخارجي. لإجراء هذه العملية برمجيًا ، توضح هذه المقالة كيفية إنشاء أرشيف ZIP مسطح في C#.

C# .NET API لإنشاء أرشيفات مضغوطة مسطحة

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

PM> Install-Package Aspose.Zip

إنشاء أرشيف مضغوط مسطح في C#

لفهم بنية أرشيف ZIP المسطح ، لنأخذ مثالاً. التالي هو أرشيف ZIP يحتوي على أرشيف ZIP آخر بداخله.

parent.zip
 ├first.txt
 ├inner.zip
 │ ├game.exe
 │ └subitem.bin
 └picture.gif

بعد تحويل أرشيف ZIP هذا إلى ملف ZIP مسطح ، سيتم استخراج جميع إدخالات ZIP الداخلي في ملف ZIP الأصلي. أخيرًا ، سنحصل على البنية التالية لـ ZIP الأصلي.

flatten.zip
 ├first.txt
 ├picture.gif
 ├game.exe
 └subitem.bin

دعونا نرى كيفية إجراء هذا التحول برمجيًا. فيما يلي خطوات إنشاء أرشيف ZIP مسطح في C#.

  • أولاً ، قم بتحميل أرشيف ZIP الرئيسي باستخدام فئة الأرشيف.
  • بعد ذلك ، أنشئ قوائم لتخزين إدخالات ZIP الداخلية لحذفها من ملف ZIP الأصلي ، والإدخالات المستخرجة وأسمائها.
  • بعد ذلك ، قم بإجراء حلقة خلال كل ArchiveEntry في ملف ZIP الأصلي باستخدام مجموعة Archive.Entries.
  • لكل إدخال ، قم بإجراء العمليات التالية:
    • تحقق مما إذا كان الإدخال عبارة عن أرشيف بتنسيق ZIP باستخدام طريقة ArchiveEntry.Name.EndsWith (". zip"، StringComparison.InvariantCultureIgnoreCase)).
    • ثم قم بإضافة إدخال إلى قائمة الإدخالات المراد حذفها.
    • افتح الإدخال في كائن MemoryStream باستخدام طريقة ArchiveEntry.Open().CopyTo (MemoryStream).
    • كرر خلال إدخالات أرشيف ZIP الداخلي وفي كل تكرار ، نفذ الخطوات التالية.
      • أضف اسم الإدخال إلى قائمة الإدخالات التي سيتم إضافتها.
      • ثم قم بتحميل الإدخال إلى MemoryStream باستخدام طريقة ArchiveEntry.Open().CopyTo (MemoryStream).
      • أخيرًا ، أضف إدخالًا إلى قائمة الإدخالات لإضافتها إلى ZIP الأصلي.
  • بعد ذلك ، انتقل إلى قائمة أرشيفات ZIP الداخلية واحذف كل إدخال باستخدام طريقة Archive.DeleteEntry (ArchiveEntry).
  • قم بعمل تكرار لقائمة الإدخالات المراد إضافتها إلى ملف ZIP الرئيسي وإضافة كل إدخال باستخدام طريقة Archive.CreateEntry (String، Stream).
  • أخيرًا ، احفظ أرشيف ZIP الأصلي باستخدام طريقة Archive.Save (String).

يوضح نموذج التعليمات البرمجية التالي كيفية إنشاء أرشيف ZIP مسطح في C#.

// تحميل أرشيف مضغوط
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
    // قم بإنشاء قائمة لحذف إدخالات ZIP الداخلية بعد الاستخراج
    List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();

    // أنشئ قائمة لإضافة أسماء الملفات في أرشيفات ZIP الداخلية
    List<string> namesToInsert = new List<string>();

    // قم بإنشاء قائمة لإضافة كائنات دفق للملفات في أرشيفات ZIP الداخلية
    List<MemoryStream> contentToInsert = new List<MemoryStream>();

    // تكرار الإدخالات في ملف ZIP الأصلي
    foreach (ArchiveEntry entry in outer.Entries)
    {
        // تحقق مما إذا كان الإدخال عبارة عن ملف مضغوط
        if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) 
        {
            // أضف إدخالًا إلى القائمة للاحتفاظ بالمرجع من أجل إزالته من الأرشيف لاحقًا
            entriesToDelete.Add(entry); 

            // قم بإنشاء كائن دفق لفتح أرشيف ZIP
            MemoryStream innerCompressed = new MemoryStream();
            entry.Open().CopyTo(innerCompressed);

            // قم بتحميل أرشيف ZIP من كائن الدفق 
            using (Archive inner = new Archive(innerCompressed))
            {
                // حلقة حول إدخالات الأرشيف
                foreach (ArchiveEntry ie in inner.Entries) 
                {
                    // احتفظ باسم الإدخال في القائمة
                    namesToInsert.Add(ie.Name); 

                    // استخراج دخول الأرشيف إلى كائن تيار
                    MemoryStream content = new MemoryStream();
                    ie.Open().CopyTo(content);

                    // إضافة إدخال إلى القائمة
                    contentToInsert.Add(content);
                }
            }
        }
    }

    // احذف أرشيفات ZIP الداخلية
    foreach (ArchiveEntry e in entriesToDelete)
        outer.DeleteEntry(e);

    // أدخل ملفات أرشيفات ZIP الداخلية في أرشيف ZIP الرئيسي
   for (int i = 0; i < namesToInsert.Count; i++)
        outer.CreateEntry(namesToInsert[i], contentToInsert[i]);

    outer.Save("Archives/flatten.zip");
}

احصل على ترخيص API مجاني

يمكنك الحصول على ترخيص مؤقت مجاني لاستخدام Aspose.ZIP لـ .NET بدون قيود تقييم.

استنتاج

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

أنظر أيضا