using System; using System.IO; using ICSharpCode.SharpZipLib.Checksum; using ICSharpCode.SharpZipLib.Zip; namespace CommonTool { public class ZipHelper { public static ZipHelper Instance { get; } = new ZipHelper(); /// /// 压缩文件 /// /// /// public bool CreateZip(string sourceFilePath, string destinationZipFilePath) { if (string.IsNullOrEmpty(sourceFilePath)) return false; if (sourceFilePath[sourceFilePath.Length - 1] != Path.DirectorySeparatorChar) sourceFilePath += Path.DirectorySeparatorChar; if (File.Exists(destinationZipFilePath)) { try { File.Delete(destinationZipFilePath); } catch { return false; } } if (!File.Exists(sourceFilePath) && !Directory.Exists(sourceFilePath)) return false; ZipOutputStream zipStream = new ZipOutputStream(File.Create(destinationZipFilePath)); zipStream.SetLevel(6); // 压缩级别 0-9 CreateZipFiles(sourceFilePath, zipStream, sourceFilePath); zipStream.Finish(); zipStream.Close(); return true; } /// /// 递归压缩文件 /// /// 待压缩的文件或文件夹路径 /// 打包结果的zip文件路径(类似 D:\WorkSpace\a.zip),全路径包括文件名和.zip扩展名 /// private void CreateZipFiles(string sourceFilePath, ZipOutputStream zipStream, string staticFile) { Crc32 crc = new Crc32(); string[] filesArray = Directory.GetFileSystemEntries(sourceFilePath); foreach (string file in filesArray) { if (Directory.Exists(file)) //如果当前是文件夹,递归 { CreateZipFiles(file, zipStream, staticFile); } else //如果是文件,开始压缩 { FileStream fileStream = File.OpenRead(file); byte[] buffer = new byte[fileStream.Length]; fileStream.Read(buffer, 0, buffer.Length); string tempFile = file.Substring(staticFile.LastIndexOf("\\", StringComparison.Ordinal) + 1); ZipEntry entry = new ZipEntry(tempFile) { DateTime = DateTime.Now, Size = fileStream.Length }; fileStream.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; zipStream.PutNextEntry(entry); zipStream.Write(buffer, 0, buffer.Length); } } } } }