using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
namespace Updater.Helpers
{
public class ZipHelper
{
/// Extracts the specified zip file with its directory hierarchy
/// Zip file to be extracted
/// New folder that the zip will be extracted into
/// Delete or keep the original zip after extracting
public static void Extract(string file, string folder, bool delete)
{
if (!file.ToLower().EndsWith(".zip"))
throw new ApplicationException("Check your file format");
if (!File.Exists(file))
throw new ApplicationException("Zip file does not exist");
if (!Directory.Exists(folder))
Directory.CreateDirectory(folder);
using (ZipInputStream zipInputStream = new ZipInputStream(File.OpenRead(file)))
{
ZipEntry zipEntry;
while ((zipEntry = zipInputStream.GetNextEntry()) != null)
{
string zipDirectory = Path.GetDirectoryName(zipEntry.Name);
string zipFile = Path.GetFileName(zipEntry.Name);
if (zipDirectory.Length > 0)
Directory.CreateDirectory(folder + Path.DirectorySeparatorChar + zipDirectory);
if (!string.IsNullOrEmpty(zipFile))
{
DecompressAndWriteFile(folder + Path.DirectorySeparatorChar + zipEntry.Name, zipInputStream);
}
}
}
}
private static void DecompressAndWriteFile(string destination, ZipInputStream source)
{
FileStream wstream = null;
try
{
// create a stream to write the file to
wstream = File.Create(destination);
const int block = 2048; // number of bytes to decompress for each read from the source
byte[] data = new byte[block]; // location to decompress the file to
// now decompress and write each block of data for the zip file entry
while (true)
{
int size = source.Read(data, 0, data.Length);
if (size > 0)
wstream.Write(data, 0, size);
else
break; // no more data
}
}
finally
{
if (wstream != null)
wstream.Close();
}
}
}
}