اغلب، شما یک آرشیو ZIP دریافت می‌کنید که حاوی آرشیوهای ZIP دیگری در داخل آن است که ساختار تودرتویی از بایگانی‌ها را تشکیل می‌دهد. در چنین مواردی، ممکن است بخواهید با استخراج تمام آرشیوهای ZIP داخلی در بایگانی بیرونی، یک ساختار مسطح به دست آورید. برای انجام این عملیات به صورت برنامه ای، این مقاله نحوه ایجاد یک آرشیو ZIP مسطح در سی شارپ را نشان می دهد.

C# .NET API برای ایجاد آرشیوهای ZIP مسطح

برای ایجاد بایگانی های ZIP مسطح، از Aspose.ZIP برای NET استفاده می کنیم. این یک API بایگانی است که برای ایجاد و استخراج فرمت های آرشیو محبوب از جمله ZIP، TAR، GZip و 7z طراحی شده است. می‌توانید API را از NuGet نصب کنید یا DLL آن را از بخش دانلودها دانلود کنید.

PM> Install-Package Aspose.Zip

ایجاد یک آرشیو ZIP مسطح در سی شارپ

برای درک ساختار یک آرشیو 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 مسطح در سی شارپ است.

  • ابتدا بایگانی ZIP والد را با استفاده از کلاس Archive بارگیری کنید.
  • سپس، لیست هایی برای ذخیره ورودی های ZIP داخلی برای حذف از ZIP والد، ورودی های استخراج شده و نام آنها ایجاد کنید.
  • پس از آن، با استفاده از مجموعه Archive.Entries از طریق هر ArchiveEntry در ZIP والد حلقه بزنید.
  • برای هر ورودی، عملیات زیر را انجام دهید:
    • بررسی کنید که آیا ورودی یک بایگانی ZIP با استفاده از روش ArchiveEntry.Name.EndsWith(.zip، StringComparison.InvariantCultureIgnoreCase)) است.
    • سپس، ورودی را به لیست ورودی‌هایی که باید حذف شوند اضافه کنید.
    • با استفاده از روش ArchiveEntry.Open().CopyTo(MemoryStream) ورودی یک شی MemoryStream را باز کنید.
    • از طریق ورودی های آرشیو ZIP داخلی تکرار کنید و در هر تکرار، مراحل زیر را انجام دهید.
      • نام ورودی را به لیست ورودی هایی که باید اضافه شوند اضافه کنید.
      • سپس با استفاده از روش ArchiveEntry.Open().CopyTo(MemoryStream) ورودی را به MemoryStream بارگذاری کنید.
      • در نهایت، ورودی را به لیست ورودی هایی که باید به ZIP والد اضافه شوند اضافه کنید.
  • سپس، فهرست آرشیوهای ZIP داخلی را مرور کنید و هر ورودی را با استفاده از روش Archive.DeleteEntry(ArchiveEntry) حذف کنید.
  • فهرست ورودی‌هایی را که باید به ZIP والد اضافه شوند حلقه بزنید و هر ورودی را با استفاده از روش Archive.CreateEntry(String, Stream) اضافه کنید.
  • در نهایت، بایگانی ZIP والد را با استفاده از روش Archive.Save(String) ذخیره کنید.

نمونه کد زیر نحوه ایجاد یک آرشیو ZIP مسطح در سی شارپ را نشان می دهد.

// بایگانی ZIP را بارگیری کنید
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)
    {
        // بررسی کنید که آیا ورودی یک فایل ZIP است
        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 برای دات نت بدون محدودیت ارزیابی، می توانید یک مجوز موقت رایگان دریافت کنید.

نتیجه

در این مقاله یاد گرفتید که چگونه یک آرشیو ZIP مسطح به صورت برنامه نویسی در سی شارپ ایجاد کنید. به ویژه، ما نحوه ایجاد یک ZIP مسطح را با استخراج آرشیوهای ZIP داخلی در ZIP والد نشان داده‌ایم. جدای از آن، می‌توانید برای اطلاعات بیشتر در مورد Aspose.ZIP برای دات‌نت به اسناد مراجعه کنید. همچنین، می توانید سوالات خود را از طریق [فروم 16 ما با ما در میان بگذارید.

همچنین ببینید