using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GCMM { public static class ZipArchiveExtensions { //https://stackoverflow.com/a/14795752/2703239 public static void ExtractToDirectory(this ZipArchive archive, string destinationDirectoryName, bool overwrite) { if (!overwrite) { archive.ExtractToDirectory(destinationDirectoryName); return; } DirectoryInfo di = Directory.CreateDirectory(destinationDirectoryName); string destinationDirectoryFullPath = di.FullName; foreach (ZipArchiveEntry file in archive.Entries) { string completeFileName = Path.GetFullPath(Path.Combine(destinationDirectoryFullPath, file.FullName)); if (!completeFileName.StartsWith(destinationDirectoryFullPath, StringComparison.OrdinalIgnoreCase)) { throw new IOException("Trying to extract file outside of destination directory. See this link for more info: https://snyk.io/research/zip-slip-vulnerability"); } if (file.Name == "") {// Assuming Empty for Directory Directory.CreateDirectory(Path.GetDirectoryName(completeFileName)); continue; } file.ExtractToFile(completeFileName, true); } } } }