using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using ICSharpCode.SharpZipLib.Checksum; using ICSharpCode.SharpZipLib.Zip; namespace Vote.Services.Tools { /// /// /// public class ZipHelper { /// /// 所有文件缓存 /// List files = new List(); /// /// 所有空目录缓存 /// List paths = new List(); /// /// 取得目录下所有文件及文件夹,分别存入files及paths /// /// 根目录 private void GetAllDirectories(string rootPath) { string[] subPaths = Directory.GetDirectories(rootPath);//得到所有子目录 foreach (string path in subPaths) { GetAllDirectories(path);//对每一个字目录做与根目录相同的操作:即找到子目录并将当前目录的文件名存入List } string[] files = Directory.GetFiles(rootPath); foreach (string file in files) { this.files.Add(file);//将当前目录中的所有文件全名存入文件List } if (subPaths.Length == files.Length && files.Length == 0)//如果是空目录 { this.paths.Add(rootPath);//记录空目录 } } /// /// 压缩目录(包括子目录及所有文件) /// /// 要压缩的根目录 /// 保存路径 /// 压缩程度,范围0-9,数值越大,压缩程序越高 public void ZipFileFromDirectory(string rootPath, string destinationPath, int compressLevel) { this.files.Clear(); GetAllDirectories(rootPath); string rootMark = rootPath + "\\";//得到当前路径的位置,以备压缩时将所压缩内容转变成相对路径。 Crc32 crc = new Crc32(); using ZipOutputStream outPutStream = new ZipOutputStream(System.IO.File.Create(destinationPath)); outPutStream.SetLevel(compressLevel); // 0 - store only to 9 - means best compression foreach (string file in files) { using FileStream fileStream = System.IO.File.OpenRead(file);//打开压缩文件 byte[] buffer = new byte[fileStream.Length]; fileStream.Read(buffer, 0, buffer.Length); ZipEntry entry = new ZipEntry(file.Replace(rootMark, string.Empty)); entry.DateTime = DateTime.Now; entry.Size = fileStream.Length; fileStream.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; outPutStream.PutNextEntry(entry); outPutStream.Write(buffer, 0, buffer.Length); } this.files.Clear(); foreach (string emptyPath in paths) { ZipEntry entry = new ZipEntry(emptyPath.Replace(rootMark, string.Empty) + "/"); outPutStream.PutNextEntry(entry); } this.paths.Clear(); outPutStream.Finish(); outPutStream.Close(); GC.Collect(); } /// /// 压缩单个文件 /// 要压缩的文件路径 /// 压缩程度,范围0-9,数值越大,压缩程序越高 /// 输出zip文件路径 /// public bool ZipOneFile(string filepath, int compressLevel) { var r = false; try { var file = new FileInfo(filepath); var dwgZipPath = GetZipFileName(filepath); Crc32 crc = new Crc32(); using ZipOutputStream outPutStream = new ZipOutputStream(System.IO.File.Create(dwgZipPath)); outPutStream.SetLevel(compressLevel); // 0 - store only to 9 - means best compression using FileStream fileStream = System.IO.File.OpenRead(filepath);//打开压缩文件 byte[] buffer = new byte[fileStream.Length]; fileStream.Read(buffer, 0, buffer.Length); ZipEntry entry = new ZipEntry(filepath.Replace(file.DirectoryName + "\\", string.Empty)); entry.DateTime = DateTime.Now; entry.Size = fileStream.Length; fileStream.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; outPutStream.PutNextEntry(entry); outPutStream.Write(buffer, 0, buffer.Length); this.files.Clear(); this.paths.Clear(); outPutStream.Finish(); outPutStream.Close(); GC.Collect(); r = true; } catch (Exception ex) { r = false; } return r; } private string GetZipFileName(string filepath) { //if (System.IO.File.Exists(filepath + ".zip")) //{ // return GetZipFileName(filepath + ".zip"); //} return filepath + ".zip"; } } }