/// <summary> /// 解压缩 /// </summary> /// <param name="zipPath">压缩包路径</param> /// <param name="path">解压缩路径</param> /// <returns></returns> public static bool UnZip(string zipPath, string path) { if (!File.Exists(zipPath)) { throw new FileNotFoundException(zipPath); } if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } if (!Directory.Exists(path)) { throw new DirectoryNotFoundException(path); } using (Stream stream = new FileStream(zipPath, FileMode.Open, FileAccess.Read)) { ZipInputStream input = new ZipInputStream(stream); List <Task> tasks = new List <Task>(); ZipEntry entry = null; do { entry = input.GetNextEntry(); if (entry is null) { break; } if (entry.IsDirectory) {// 文件夹 string tempPath = Path.Combine(path, entry.Name.Replace("/", "\\")); var info = new DirectoryInfo(tempPath); if (!info.Exists) { info.Create(); } info.LastWriteTime = entry.DateTime; } else if (entry.IsFile) {// 文件 byte[] content = new byte[entry.Size]; input.Read(content, 0, content.Length); var task = new Task((o) => { var _ = (Tuple <ZipEntry, byte[]>)o; //var param = (entry: _.Item1, content: _.Item2); var _entry = _.Item1; var _content = _.Item2; string name = _entry.Name.Replace("/", "\\"); // 如果路径不存在,创建路径 string filePath = TxFile.GetFilePath(name); if (!string.IsNullOrWhiteSpace(filePath) && !Directory.Exists(Path.Combine(path, filePath))) { Directory.CreateDirectory(Path.Combine(path, filePath)); } // 写文件 string fullPath = Path.Combine(path, name); var fi = File.Create(fullPath); fi.Write(_content, 0, _content.Length); fi.Close(); FileInfo info = new FileInfo(fullPath); info.LastWriteTime = _entry.DateTime; }, Tuple.Create(entry, content)); task.Start(); tasks.Add(task); } } while (entry != null); input.Close(); Task.WaitAll(tasks.ToArray()); } return(true); }