บ่อยครั้ง คุณจะได้รับไฟล์เก็บถาวร ZIP ที่มีไฟล์เก็บถาวร ZIP อื่นๆ อยู่ภายใน ซึ่งสร้างโครงสร้างที่ซ้อนกันของไฟล์เก็บถาวร ในกรณีเช่นนี้ คุณอาจต้องการโครงสร้างแบบเรียบโดยแตกไฟล์ ZIP ภายในทั้งหมดลงในไฟล์เก็บถาวรภายนอก ในการดำเนินการนี้โดยทางโปรแกรม บทความนี้แสดงวิธีสร้างไฟล์ ZIP แบบแฟลตใน C#

C# .NET API เพื่อสร้างแฟลตไฟล์ ZIP

ในการสร้างไฟล์เก็บถาวร ZIP แบบแบน เราจะใช้ Aspose.ZIP for .NET เป็น API การเก็บถาวรที่ออกแบบมาเพื่อสร้างและแยกรูปแบบไฟล์เก็บถาวรยอดนิยม เช่น ZIP, TAR, GZip และ 7z คุณสามารถติดตั้ง API จาก NuGet หรือดาวน์โหลด DLL จาก ส่วนดาวน์โหลด

PM> Install-Package Aspose.Zip

สร้างแฟลตไฟล์ 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 หลักโดยใช้คลาส Archive
  • จากนั้น สร้างรายการเพื่อจัดเก็บรายการ 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#

// โหลดไฟล์ 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 for .NET โดยไม่มีข้อจำกัดในการประเมิน

บทสรุป

ในบทความนี้ คุณได้เรียนรู้วิธีสร้างไฟล์ ZIP แบบแฟลตโดยทางโปรแกรมใน C# โดยเฉพาะอย่างยิ่ง เราได้สาธิตวิธีสร้าง ZIP แบบเรียบโดยแยกไฟล์ ZIP ภายในออกเป็นไฟล์ ZIP หลัก นอกเหนือจากนั้น คุณสามารถไปที่ เอกสารประกอบ เพื่ออ่านเพิ่มเติมเกี่ยวกับ Aspose.ZIP for .NET นอกจากนี้ คุณสามารถแบ่งปันคำถามของคุณกับเราผ่านทาง ฟอรัม

ดูสิ่งนี้ด้วย