Genellikle, arşivlerin iç içe yapısını oluşturan diğer ZIP arşivlerini içeren bir ZIP arşivi alırsınız. Bu gibi durumlarda tüm iç ZIP arşivlerini dış arşive çıkartarak düz bir yapı elde etmek isteyebilirsiniz. Bu işlemi programlı olarak gerçekleştirmek için bu makale, C# dilinde düz bir ZIP arşivinin nasıl oluşturulacağını gösterir.
Düz ZIP Arşivleri Oluşturmak için C# .NET API
Düz ZIP arşivlerini oluşturmak için Aspose.ZIP for .NET kullanacağız. ZIP, TAR, GZip ve 7z gibi popüler arşiv formatlarını oluşturmak ve ayıklamak için tasarlanmış bir arşivleme API’sidir. API’yi NuGet’ten yükleyebilir veya DLL’sini indirilenler bölümünden indirebilirsiniz.
PM> Install-Package Aspose.Zip
C# ile Düz ZIP Arşivi Oluşturma
Düz bir ZIP arşivinin yapısını anlamak için bir örnek verelim. Aşağıdaki, içinde başka bir ZIP arşivi içeren bir ZIP arşividir.
parent.zip
├first.txt
├inner.zip
│ ├game.exe
│ └subitem.bin
└picture.gif
Bu ZIP arşivini düz bir ZIP’e dönüştürdükten sonra, iç ZIP’in tüm girişleri ana ZIP’e çıkarılacaktır. Son olarak, ana ZIP’in aşağıdaki yapısını elde edeceğiz.
flatten.zip
├first.txt
├picture.gif
├game.exe
└subitem.bin
Bu dönüşümü programlı olarak nasıl gerçekleştireceğimizi görelim. Aşağıda, C# dilinde düz bir ZIP arşivi oluşturma adımları yer almaktadır.
- İlk olarak, Archive sınıfını kullanarak ana ZIP arşivini yükleyin.
- Ardından, üst ZIP’ten silinecek iç ZIP girişlerini, ayıklanan girişleri ve adlarını depolamak için listeler oluşturun.
- Bundan sonra, Archive.Entries koleksiyonunu kullanarak üst ZIP’deki her ArchiveEntry arasında geçiş yapın.
- Her giriş için aşağıdaki işlemleri gerçekleştirin:
- ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) yöntemini kullanarak girişin bir ZIP arşivi olup olmadığını kontrol edin.
- Ardından, silinecek girişler listesine giriş ekleyin.
- ArchiveEntry.Open().CopyTo(MemoryStream) yöntemini kullanarak bir MemoryStream nesnesine giriş açın.
- Dahili ZIP arşivinin girişlerini yineleyin ve her yinelemede aşağıdaki adımları gerçekleştirin.
- Eklenecek girişler listesine girişin adını ekleyin.
- Ardından, ArchiveEntry.Open().CopyTo(MemoryStream) yöntemini kullanarak girişi MemoryStream’e yükleyin.
- Son olarak, ana ZIP’e eklenecek girişler listesine giriş ekleyin.
- Ardından, dahili ZIP arşivleri listesinde dolaşın ve Archive.DeleteEntry(ArchiveEntry) yöntemini kullanarak her girişi silin.
- Ana ZIP’e eklenecek girişler listesinde dolaşın ve her girişi Archive.CreateEntry(String, Stream) yöntemini kullanarak ekleyin.
- Son olarak, Archive.Save(String) yöntemini kullanarak ana ZIP arşivini kaydedin.
Aşağıdaki kod örneği, C# dilinde düz bir ZIP arşivinin nasıl oluşturulacağını gösterir.
// ZIP arşivini yükle
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
// Ayıklamadan sonra dahili ZIP girişlerini silmek için bir liste oluşturun
List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();
// Dahili ZIP arşivlerindeki dosyaların adlarını eklemek için bir liste oluşturun
List<string> namesToInsert = new List<string>();
// Dosyaların akış nesnelerini dahili ZIP arşivlerine eklemek için bir liste oluşturun
List<MemoryStream> contentToInsert = new List<MemoryStream>();
// Üst ZIP'deki girişler arasında geçiş yapın
foreach (ArchiveEntry entry in outer.Entries)
{
// Girişin bir ZIP dosyası olup olmadığını kontrol edin
if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase))
{
// Daha sonra arşivden kaldırmak üzere referansı tutmak için listeye giriş ekleyin
entriesToDelete.Add(entry);
// ZIP arşivini açmak için akış nesnesi oluşturun
MemoryStream innerCompressed = new MemoryStream();
entry.Open().CopyTo(innerCompressed);
// Akış nesnesinden ZIP arşivini yükleyin
using (Archive inner = new Archive(innerCompressed))
{
// Arşiv girişleri üzerinde döngü
foreach (ArchiveEntry ie in inner.Entries)
{
// Girişin adını listede tut
namesToInsert.Add(ie.Name);
// Arşiv girişini bir akış nesnesine çıkarın
MemoryStream content = new MemoryStream();
ie.Open().CopyTo(content);
// Listeye giriş ekle
contentToInsert.Add(content);
}
}
}
}
// Dahili ZIP arşivlerini silin
foreach (ArchiveEntry e in entriesToDelete)
outer.DeleteEntry(e);
// Dahili ZIP arşivlerinin dosyalarını ana ZIP arşivine ekleyin
for (int i = 0; i < namesToInsert.Count; i++)
outer.CreateEntry(namesToInsert[i], contentToInsert[i]);
outer.Save("Archives/flatten.zip");
}
Ücretsiz API Lisansı Alın
Aspose.ZIP for .NET’i değerlendirme sınırlamaları olmaksızın kullanmak için ücretsiz bir geçici lisans alabilirsiniz.
Çözüm
Bu makalede, C# dilinde programlı olarak düz bir ZIP arşivi oluşturmayı öğrendiniz. Özellikle, iç ZIP arşivlerini ana ZIP’e çıkararak düz bir ZIP’in nasıl yapıldığını gösterdik. Bunun dışında, Aspose.ZIP for .NET hakkında daha fazla bilgi edinmek için belgeleri ziyaret edebilirsiniz. Ayrıca, sorularınızı [forumumuz] aracılığıyla bizimle paylaşabilirsiniz]16.