Seringkali, Anda mendapatkan arsip ZIP yang berisi arsip ZIP lain di dalamnya yang membentuk struktur arsip bersarang. Dalam kasus seperti itu, Anda mungkin ingin mendapatkan struktur datar dengan mengekstraksi semua arsip ZIP bagian dalam ke dalam arsip bagian luar. Untuk melakukan operasi ini secara terprogram, artikel ini menunjukkan cara membuat arsip ZIP datar di C#.
C# .NET API untuk Membuat Arsip ZIP Datar
Untuk membuat arsip ZIP datar, kita akan menggunakan Aspose.ZIP for .NET. Ini adalah API pengarsipan yang dirancang untuk membuat dan mengekstrak format arsip populer termasuk ZIP, TAR, GZip, dan 7z. Anda dapat menginstal API dari NuGet atau mengunduh DLL-nya dari bagian unduhan.
PM> Install-Package Aspose.Zip
Buat Arsip ZIP Datar di C#
Untuk memahami struktur arsip ZIP datar, mari kita ambil contoh. Berikut ini adalah arsip ZIP yang berisi arsip ZIP lain di dalamnya.
parent.zip
├first.txt
├inner.zip
│ ├game.exe
│ └subitem.bin
└picture.gif
Setelah mengubah arsip ZIP ini menjadi ZIP datar, semua entri ZIP bagian dalam akan diekstrak ke dalam ZIP induk. Terakhir, kita akan mendapatkan struktur ZIP induk berikut.
flatten.zip
├first.txt
├picture.gif
├game.exe
└subitem.bin
Mari kita lihat bagaimana melakukan transformasi ini secara terprogram. Berikut ini adalah langkah-langkah untuk membuat arsip ZIP datar di C#.
- Pertama, muat arsip ZIP induk menggunakan kelas Archive.
- Kemudian, buat daftar untuk menyimpan entri ZIP bagian dalam untuk dihapus dari ZIP induk, entri yang diekstrak, dan namanya.
- Setelah itu, ulangi setiap ArchiveEntry di ZIP induk menggunakan koleksi Archive.Entries.
- Untuk setiap entri, lakukan operasi berikut:
- Periksa apakah entri adalah arsip ZIP menggunakan metode ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)).
- Kemudian, tambahkan entri ke daftar entri yang akan dihapus.
- Buka entri ke objek MemoryStream menggunakan metode ArchiveEntry.Open().CopyTo(MemoryStream).
- Iterasi melalui entri arsip ZIP dalam dan di setiap iterasi, lakukan langkah-langkah berikut.
- Tambahkan nama entri ke dalam daftar entri yang akan ditambahkan.
- Kemudian, muat entri ke MemoryStream menggunakan metode ArchiveEntry.Open().CopyTo(MemoryStream).
- Terakhir, tambahkan entri ke daftar entri yang akan ditambahkan ke ZIP induk.
- Kemudian, telusuri daftar arsip ZIP dalam dan hapus setiap entri menggunakan metode Archive.DeleteEntry(ArchiveEntry).
- Telusuri daftar entri yang akan ditambahkan ke ZIP induk dan tambahkan setiap entri menggunakan metode Archive.CreateEntry(String, Stream).
- Terakhir, simpan arsip ZIP induk menggunakan metode Archive.Save(String).
Contoh kode berikut menunjukkan cara membuat arsip ZIP datar di C#.
// Muat arsip ZIP
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
// Buat daftar untuk menghapus entri ZIP dalam setelah ekstraksi
List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();
// Buat daftar untuk menambahkan nama file di arsip ZIP bagian dalam
List<string> namesToInsert = new List<string>();
// Buat daftar untuk menambahkan objek aliran file di arsip ZIP bagian dalam
List<MemoryStream> contentToInsert = new List<MemoryStream>();
// Ulangi entri di ZIP induk
foreach (ArchiveEntry entry in outer.Entries)
{
// Periksa apakah entri adalah file ZIP
if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
{
// Tambahkan entri ke daftar untuk menyimpan referensi untuk menghapusnya dari arsip nanti
entriesToDelete.Add(entry);
// Buat objek aliran untuk membuka arsip ZIP
MemoryStream innerCompressed = new MemoryStream();
entry.Open().CopyTo(innerCompressed);
// Muat arsip ZIP dari objek aliran
using (Archive inner = new Archive(innerCompressed))
{
// Ulangi entri arsip
foreach (ArchiveEntry ie in inner.Entries)
{
// Simpan nama entri dalam daftar
namesToInsert.Add(ie.Name);
// Ekstrak entri arsip ke objek aliran
MemoryStream content = new MemoryStream();
ie.Open().CopyTo(content);
// Tambahkan entri ke daftar
contentToInsert.Add(content);
}
}
}
}
// Hapus arsip ZIP bagian dalam
foreach (ArchiveEntry e in entriesToDelete)
outer.DeleteEntry(e);
// Masukkan file arsip ZIP dalam ke arsip ZIP induk
for (int i = 0; i < namesToInsert.Count; i++)
outer.CreateEntry(namesToInsert[i], contentToInsert[i]);
outer.Save("Archives/flatten.zip");
}
Dapatkan Lisensi API Gratis
Anda bisa mendapatkan lisensi sementara gratis untuk menggunakan Aspose.ZIP for .NET tanpa batasan evaluasi.
Kesimpulan
Pada artikel ini, Anda telah mempelajari cara membuat arsip ZIP datar secara terprogram dalam C#. Khususnya, kami telah mendemonstrasikan cara membuat ZIP datar dengan mengekstrak arsip ZIP bagian dalam ke dalam ZIP induk. Selain itu, Anda dapat mengunjungi dokumentasi untuk membaca lebih lanjut tentang Aspose.ZIP for .NET. Selain itu, Anda dapat membagikan pertanyaan Anda kepada kami melalui forum kami.