Here is a code snippet of how to compress one or many files to a zip archive in memory using C#.
It works in .Net Core and .Net Full Framework
public static byte[] GetZipArchive(params InMemoryFile[] files)
{
byte[] archiveFile;
using (var archiveStream = new MemoryStream())
{
using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
{
foreach (var file in files)
{
var zipArchiveEntry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest);
using var zipStream = zipArchiveEntry.Open();
zipStream.Write(file.Content, 0, file.Content.Length);
}
}
archiveFile = archiveStream.ToArray();
}
return archiveFile;
}
Very simple, right?
Here is a sample Console Application in C# .Net Core.
using System;
using System.IO;
using System.IO.Compression;
namespace ConsoleApp1
{
class InMemoryFile
{
public string FileName { get; set; }
public byte[] Content { get; set; }
}
class Program
{
static void Main(string[] args)
{
using var fs = File.OpenRead(@"C:\Users\rmauro\Pictures\cool-computer.jpg");
var files = new[]
{
LoadFromFile(@"C:\Users\rmauro\Pictures\cool-computer.jpg"),
LoadFromFile(@"C:\Users\rmauro\Pictures\34778.jpg"),
};
var result = GetZipArchive(files);
using var fw = File.OpenWrite(@"C:\Users\rmauro\Pictures\out.zip");
using var memZip = new MemoryStream(result);
memZip.CopyTo(fw);
fw.Close();
Console.ReadKey();
}
static InMemoryFile LoadFromFile(string path)
{
using var fs = File.OpenRead(path);
using var memFile = new MemoryStream();
fs.CopyTo(memFile);
memFile.Seek(0, SeekOrigin.Begin);
return new InMemoryFile() { Content = memFile.ToArray(), FileName = Path.GetFileName(path) };
}
public static byte[] GetZipArchive(params InMemoryFile[] files)
{
byte[] archiveFile;
using (var archiveStream = new MemoryStream())
{
using (var archive = new ZipArchive(archiveStream, ZipArchiveMode.Create, true))
{
foreach (var file in files)
{
var zipArchiveEntry = archive.CreateEntry(file.FileName, CompressionLevel.Fastest);
using var zipStream = zipArchiveEntry.Open();
zipStream.Write(file.Content, 0, file.Content.Length);
}
}
archiveFile = archiveStream.ToArray();
}
return archiveFile;
}
}
}
Hope it helps. Leave a comment.
Top comments (0)