/// <summary> /// 文件壓縮類 /// </summary> public class ZipHelper { /// <summary> /// 單文件壓縮成ZIP /// </summary> /// <param name="fileSource">源文件路徑</param> /// <param name="fileOut">ZIP文件路徑</param> /// <param name="fileName">ZIP文件名:相對路徑</param> /// <returns></returns> public static void SimpleFileZip(string fileSource, string fileOut, string fileName) { using (FileStream zipFileToOpen = new FileStream(fileOut, FileMode.OpenOrCreate)) { using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update)) { fileName = fileName.Trim(Path.DirectorySeparatorChar); ZipFile(fileSource, fileName, archive); } } } /// <summary> /// 多文件壓縮成ZIP /// </summary> /// <param name="fileSource">源文件路徑</param> /// <param name="fileOut">ZIP文件路徑</param> /// <param name="fileName">ZIP文件名</param> /// <returns></returns> public static void FilesZip(List<string> fileSources, string fileOut) { using (FileStream zipFileToOpen = new FileStream(fileOut, FileMode.OpenOrCreate)) { using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update)) { foreach (var file in fileSources) { string fileName = file.Replace(AppConsts.ServerUpdateFile + Path.DirectorySeparatorChar, ""); ZipFile(file, fileName, archive); } } } } /// <summary> /// 壓縮指定文件夾 /// </summary> /// <param name="sourceDirectory"></param> /// <param name="fileOut"></param> public static void DirectoryZip(string sourceDirectory, string fileOut) { string[] allFiles = Directory.GetFiles(sourceDirectory, "", SearchOption.AllDirectories); using (FileStream zipFileToOpen = new FileStream(fileOut, FileMode.OpenOrCreate)) { using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update)) { foreach (var file in allFiles) { //獲取壓縮文件相對目錄 string fileName = file.Replace(sourceDirectory + Path.DirectorySeparatorChar, ""); ZipFile(file, fileName, archive); } } } } /// <summary> /// 解壓文件到指定目錄 /// </summary> /// <param name="upZipDirPath"></param> /// <param name="zipPath"></param> public static void UnZip(string upZipDirPath, string zipPath) { if (!Directory.Exists(upZipDirPath)) Directory.CreateDirectory(upZipDirPath); using (FileStream zipFileToOpen = new FileStream(zipPath, FileMode.Open)) { using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Read)) { archive.ExtractToDirectory(upZipDirPath); } } } /// <summary> /// 生成壓縮文件 /// </summary> /// <param name="fileSource">源文件</param> /// <param name="fileName">壓縮文件相對目錄</param> /// <param name="archive">壓縮文件包</param> private static void ZipFile(string fileSource, string fileName, ZipArchive archive) { ZipArchiveEntry readMeEntry = archive.CreateEntry(fileName); readMeEntry.LastWriteTime = File.GetLastWriteTime(fileSource); using (Stream stream = readMeEntry.Open()) { byte[] bytes = File.ReadAllBytes(fileSource); stream.Write(bytes, 0, bytes.Length); } } }