บ่อยครั้ง คุณจะได้รับไฟล์เก็บถาวร 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 นอกจากนี้ คุณสามารถแบ่งปันคำถามของคุณกับเราผ่านทาง ฟอรัม