Klasa ZipFilesHelper pozwala na pakowanie i rozpakowywanie zawartości wybranych folderów do archiwów .zip. Operacje wykonywane są w oparciu o funkcjonalności zawarte w powłoce Windows: tzw. foldery skompresowane.
Projekt musi zawierać referencję do "Microsoft Shell Controls And Automation" (zakładka COM).
using System; using System.IO; using System.Runtime.InteropServices; using Shell32; namespace ZipZipFilesHelper { public static class ZipFilesHelper { private static void Compress(string SourceFolderPath, string DestinationZipFilePath, bool OnlyFolderItems) { File.WriteAllText(DestinationZipFilePath, "PK\x05\x06" + new String('\0', 18)); Shell shell = new Shell32.Shell(); Folder SrcFolder = shell.NameSpace(SourceFolderPath); Folder DestFolder = shell.NameSpace(DestinationZipFilePath); if (OnlyFolderItems) { FolderItems items = SrcFolder.Items(); DestFolder.CopyHere(items, 0); } else DestFolder.CopyHere(SrcFolder, 0); Marshal.FinalReleaseComObject(shell); } // Rozpakowuje do wskazaqnego folderu public static void UnCompress(string SourceZipFilePath, string DestinationFolderPath) { if(!Directory.Exists(DestinationFolderPath)) Directory.CreateDirectory(DestinationFolderPath); Shell shell = new Shell32.Shell(); Folder DestFolder = shell.NameSpace(DestinationFolderPath); Folder Src = shell.NameSpace(SourceZipFilePath); FolderItems items = Src.Items(); DestFolder.CopyHere(items, 0); Marshal.FinalReleaseComObject(shell); } // Rozpakowuje do tego samego folderu ("extract here") public static void UnCompress(string SourceZipFilePath) { string DestinationFolderPath = Path.GetDirectoryName(SourceZipFilePath); UnCompress(SourceZipFilePath, DestinationFolderPath); } // Pakuje elementy (pliki i podkatalogi) ze wskazanego folderu public static void CompressFolderItems(string SourceFolderPath, string DestinationZipFilePath) { Compress(SourceFolderPath, DestinationZipFilePath, true); } // Pakuje zawartość folderu razem z nim (głównym katalogiem w folderze skompresowanym będzie SourceFolderPath) public static void CompressFolder(string SourceFolderPath, string DestinationZipFilePath) { Compress(SourceFolderPath, DestinationZipFilePath, false); } } }