/// <summary> /// 压缩文件夹 /// </summary> /// <param name="_path">要压缩的文件夹</param> /// <param name="_parentRelPath">要压缩的文件夹的父相对文件夹</param> /// <param name="_zipOutputStream">压缩输出流</param> /// <param name="_zipCallback">ZipCallback对象,负责回调</param> /// <returns></returns> private static bool ZipDirectory(string _path, string _parentRelPath, ZipOutputStream _zipOutputStream, C_ZipCallback _zipCallback = null) { ZipEntry entry = null; try { string entryName = Path.Combine(_parentRelPath, Path.GetFileName(_path) + '/'); entry = new ZipEntry(entryName); entry.DateTime = System.DateTime.Now; entry.Size = 0; if ((null != _zipCallback) && !_zipCallback.OnPreZip(entry)) { return(true); // 过滤 } _zipOutputStream.PutNextEntry(entry); _zipOutputStream.Flush(); string[] files = Directory.GetFiles(_path); for (int index = 0; index < files.Length; ++index) { ZipFile(files[index], Path.Combine(_parentRelPath, Path.GetFileName(_path)), _zipOutputStream, _zipCallback); } } catch (System.Exception _e) { Debug.LogError("[ZipUtility.ZipDirectory]: " + _e.ToString()); return(false); } string[] directories = Directory.GetDirectories(_path); for (int index = 0; index < directories.Length; ++index) { if (!ZipDirectory(directories[index], Path.Combine(_parentRelPath, Path.GetFileName(_path)), _zipOutputStream, _zipCallback)) { return(false); } } if (null != _zipCallback) { _zipCallback.OnPostZip(entry); } return(true); }
/// <summary> /// 压缩文件和文件夹 /// </summary> /// <param name="_fileOrDirectoryArray">文件夹路径和文件名</param> /// <param name="_outputPathName">压缩后的输出路径文件名</param> /// <param name="_password">压缩密码</param> /// <param name="_zipCallback">ZipCallback对象,负责回调</param> /// <returns></returns> public static bool Zip(string[] _fileOrDirectoryArray, string _outputPathName, string _password = null, C_ZipCallback _zipCallback = null) { if ((null == _fileOrDirectoryArray) || string.IsNullOrEmpty(_outputPathName)) { if (null != _zipCallback) { _zipCallback.OnFinished(false); } return(false); } ZipOutputStream zipOutputStream = new ZipOutputStream(File.Create(_outputPathName)); zipOutputStream.SetLevel(6); // 压缩质量和压缩速度的平衡点 if (!string.IsNullOrEmpty(_password)) { zipOutputStream.Password = _password; } for (int index = 0; index < _fileOrDirectoryArray.Length; ++index) { bool result = false; string fileOrDirectory = _fileOrDirectoryArray[index]; if (Directory.Exists(fileOrDirectory)) { result = ZipDirectory(fileOrDirectory, string.Empty, zipOutputStream, _zipCallback); } else if (File.Exists(fileOrDirectory)) { result = ZipFile(fileOrDirectory, string.Empty, zipOutputStream, _zipCallback); } if (!result) { if (null != _zipCallback) { _zipCallback.OnFinished(false); } return(false); } } zipOutputStream.Finish(); zipOutputStream.Close(); if (null != _zipCallback) { _zipCallback.OnFinished(true); } return(true); }
/// <summary> /// 压缩文件 /// </summary> /// <param name="_filePathName">文件路径名</param> /// <param name="_parentRelPath">要压缩的文件的父相对文件夹</param> /// <param name="_zipOutputStream">压缩输出流</param> /// <param name="_zipCallback">ZipCallback对象,负责回调</param> /// <returns></returns> private static bool ZipFile(string _filePathName, string _parentRelPath, ZipOutputStream _zipOutputStream, C_ZipCallback _zipCallback = null) { //Crc32 crc32 = new Crc32(); ZipEntry entry = null; FileStream fileStream = null; try { string entryName = _parentRelPath + '/' + Path.GetFileName(_filePathName); entry = new ZipEntry(entryName); entry.DateTime = System.DateTime.Now; if ((null != _zipCallback) && !_zipCallback.OnPreZip(entry)) { return(true); } fileStream = File.OpenRead(_filePathName); byte[] buffer = new byte[fileStream.Length]; fileStream.Read(buffer, 0, buffer.Length); fileStream.Close(); entry.Size = buffer.Length; _zipOutputStream.PutNextEntry(entry); _zipOutputStream.Write(buffer, 0, buffer.Length); } catch (System.Exception _e) { Debug.LogError("[ZipUtility.ZipFile]: " + _e.ToString()); return(false); } finally { if (null != fileStream) { fileStream.Close(); fileStream.Dispose(); } } if (null != _zipCallback) { _zipCallback.OnPostZip(entry); } return(true); }