MemoryStream Kullanarak Zip Dosyası OluşturmakBeğen
Diskte yer almayan, diskten okuyamadığımız ya da çalışma sırasında üretilmiş doküman içeriklerini kullanarak sıkıştırılmış doküman oluşturma ihtiyacımız olduğunu varsayıyorum. .Net Core platformunda yer alan System.IO.Compression kütüphanesindeki klasik ZipArchive sınıfını kullanarak ikili veriden (binary data) aşağıdaki gibi bir metod yardımı ile sıkıştırılmış doküman verisi elde edebiliriz. Daha sonra bu veriyi diske yazdırarak diskte zip dokümanı elde edeceğiz.
/// <summary>
/// Compresses file binaries with names and returns zip file binary.
/// </summary>
/// <param name="files">File name and content</param>
/// <returns>Zip binary content</returns>
public static byte[] CompressFiles(Dictionary<string, byte[]> files)
{
using (var zipArchiveMemoryStream = new MemoryStream())
{
using (var zipArchive = new ZipArchive(zipArchiveMemoryStream, ZipArchiveMode.Create, true))
{
foreach (var file in files)
{
var fileContent = file.Value;
var fileName = file.Key;
var zipArchiveEntry = zipArchive.CreateEntry(fileName);
using (var zipArchiveEntryStream = zipArchiveEntry.Open())
using (var binaryWriter = new BinaryWriter(zipArchiveEntryStream))
{
binaryWriter.Write(fileContent);
}
}
}
return zipArchiveMemoryStream.ToArray();
}
}
Metot basitçe aşağıdaki gibi kullanılabilir. Çalışma zamanı (runtime) esnasında rastgele txt doküman içerikleri oluşturarak ziplenecek dosyalara ekledim.
var files = new Dictionary<string, byte[]>();
for (var i = 0; i < 5; i++)
{
using (var memoryStream = new MemoryStream())
{
using (var streamWriter = new StreamWriter(memoryStream))
{
streamWriter.WriteLine($"Text Content {i}");
}
files.Add($"{i}.txt", memoryStream.ToArray());
}
}
var zipBinary1 = CompressFiles(files);
File.WriteAllBytes($"TestFiles/{Guid.NewGuid()}.zip", zipBinary1);
Zip içinde dizinler oluşturmak istiyorsanız dosya isimlerini "DizinAdı/dosyaismi.uzantı" şeklinde belirtebilirsiniz. Ör: "Dosyalarım/Yazılar/1.txt" gibi.