Ejemplo n.º 1
0
        /// <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);
        }