untiy代码打压缩包,可设置密码

1、简单介绍:

用的是一个插件SharpZipLib,在vs的Nuget下载,也可以去github下载https://github.com/icsharpcode/SharpZipLib

用这个最主要的是因为,这个不用请求windows的文件读写权限,关于这个权限我搞了好久,到最后还不如这个好用 

2、开始安装 

这里介绍一下vs里的下载,首先在unity中随便创建一个脚本,然后双击打开进入vs,在上方工具栏中选“项目-管理NuGet程序包

 然后会出现一个界面

 点击上方的浏览-在搜索框中直接搜索SharpZipLib,然后会出现一堆的东西,不要犹豫,就是第一个(应该是吧),点击安装

 安装好后进入unity,你会发现我们安装的.dll并不在unity工程中,那是因为vs给我们下载到了Packages中,我们进入Packages,找插件名称的文件夹,进去后选lib文件夹,然后根据自己用的API版本,拖不同的SharpZipLib.dll进unity中,拿我的举例,我的是.net2.1,那我就拿net2.1进去

 

 至此,引用完成

3、简单使用

我们在unity中创建zip.cs脚本

using ICSharpCode.SharpZipLib.Checksum;
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;namespace VRS.Util
{public class Zip{/// <summary>/// 压缩文件夹/// </summary>/// <param name="dirPath">压缩文件夹的路径</param>/// <param name="fileName">生成的zip文件路径</param>/// <param name="level">压缩级别 0 - 9 0是存储级别 9是最大压缩</param>/// <param name="bufferSize">读取文件的缓冲区大小</param>public void CompressDirectory(string dirPath, string fileName, int level, int bufferSize){byte[] buffer = new byte[bufferSize];using (ZipOutputStream s = new ZipOutputStream(File.Create(fileName))){s.SetLevel(level);CompressDirectory(dirPath, dirPath, s, buffer);s.Finish();s.Close();}}/// <summary>/// 压缩目录/// </summary>/// <param name="FolderToZip">待压缩的文件夹,全路径格式</param>/// <param name="ZipedFile">压缩后的文件名,全路径格式</param>/// <returns></returns>public bool ZipFileDictory(string FolderToZip, string ZipedFile, string Password = ""){bool res;if (!Directory.Exists(FolderToZip))return false;ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFile));s.SetLevel(6);if (!string.IsNullOrEmpty(Password.Trim()))s.Password = Password.Trim();res = ZipFileDictory(FolderToZip, s, "");s.Finish();s.Close();return res;}/// <summary>/// 递归压缩文件夹方法/// </summary>/// <param name="FolderToZip"></param>/// <param name="s"></param>/// <param name="ParentFolderName"></param>private bool ZipFileDictory(string FolderToZip, ZipOutputStream s, string ParentFolderName){bool res = true;string[] folders, filenames;ZipEntry entry = null;FileStream fs = null;Crc32 crc = new Crc32();try{//创建当前文件夹entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/"));  //加上 “/” 才会当成是文件夹创建s.PutNextEntry(entry);s.Flush();//先压缩文件,再递归压缩文件夹filenames = Directory.GetFiles(FolderToZip);foreach (string file in filenames){//打开压缩文件fs = File.OpenRead(file);byte[] buffer = new byte[fs.Length];fs.Read(buffer, 0, buffer.Length);entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/" + Path.GetFileName(file)));entry.DateTime = DateTime.Now;entry.Size = fs.Length;fs.Close();crc.Reset();crc.Update(buffer);entry.Crc = crc.Value;s.PutNextEntry(entry);s.Write(buffer, 0, buffer.Length);}}catch{res = false;}finally{if (fs != null){fs.Close();fs = null;}if (entry != null)entry = null;GC.Collect();GC.Collect(1);}folders = Directory.GetDirectories(FolderToZip);foreach (string folder in folders){if (!ZipFileDictory(folder, s, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip))))return false;}return res;}/// <summary>/// 压缩文件夹/// </summary>/// <param name="root">压缩文件夹路径</param>/// <param name="path">压缩文件夹内当前要压缩的文件夹路径</param>/// <param name="s"></param>/// <param name="buffer">读取文件的缓冲区大小</param>private void CompressDirectory(string root, string path, ZipOutputStream s, byte[] buffer){//root = root.TrimEnd('//') + "//";string[] fileNames = Directory.GetFiles(path);string[] dirNames = Directory.GetDirectories(path);string relativePath = path.Replace(root, "");if (relativePath != ""){relativePath = relativePath.Replace("//", "/") + "/";}int sourceBytes;foreach (string file in fileNames){ZipEntry entry = new ZipEntry(relativePath + Path.GetFileName(file));entry.DateTime = DateTime.Now;s.PutNextEntry(entry);using (FileStream fs = File.OpenRead(file)){do{sourceBytes = fs.Read(buffer, 0, buffer.Length);s.Write(buffer, 0, sourceBytes);} while (sourceBytes > 0);}}foreach (string dirName in dirNames){string relativeDirPath = dirName.Replace(root, "");ZipEntry entry = new ZipEntry(relativeDirPath.Replace("//", "/") + "/");s.PutNextEntry(entry);CompressDirectory(root, dirName, s, buffer);}}/// <summary>/// 解压缩zip文件/// </summary>/// <param name="zipFilePath">解压的zip文件路径</param>/// <param name="extractPath">解压到的文件夹路径</param>/// <param name="bufferSize">读取文件的缓冲区大小</param>public void Extract(string zipFilePath, string extractPath, int bufferSize){//extractPath = extractPath.TrimEnd('//') + "//";byte[] data = new byte[bufferSize];int size;using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath))){ZipEntry entry;while ((entry = s.GetNextEntry()) != null){string directoryName = Path.GetDirectoryName(entry.Name);string fileName = Path.GetFileName(entry.Name);//先创建目录if (directoryName.Length > 0){Directory.CreateDirectory(extractPath + directoryName);}if (fileName != String.Empty){using (FileStream streamWriter = File.Create(extractPath + entry.Name.Replace("/", "//"))){while (true){size = s.Read(data, 0, data.Length);if (size > 0){streamWriter.Write(data, 0, size);}else{break;}}}}}}}public void CreateZip(string sourceFilePath, string destinationZipFilePath){if (sourceFilePath[sourceFilePath.Length - 1] != System.IO.Path.DirectorySeparatorChar)sourceFilePath += System.IO.Path.DirectorySeparatorChar;ZipOutputStream zipStream = new ZipOutputStream(File.Create(destinationZipFilePath));zipStream.SetLevel(6);  // 压缩级别 0-9CreateZipFiles(sourceFilePath, zipStream, sourceFilePath);zipStream.Finish();zipStream.Close();}/// <summary>/// 递归压缩文件/// </summary>/// <param name="sourceFilePath">待压缩的文件或文件夹路径</param>/// <param name="zipStream">打包结果的zip文件路径(类似 D:\WorkSpace\a.zip),全路径包括文件名和.zip扩展名</param>/// <param name="staticFile"></param>private static 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("\\") + 1);ZipEntry entry = new ZipEntry(tempFile);entry.DateTime = DateTime.Now;entry.Size = fileStream.Length;fileStream.Close();crc.Reset();crc.Update(buffer);entry.Crc = crc.Value;zipStream.PutNextEntry(entry);zipStream.Write(buffer, 0, buffer.Length);}}}}
}

然后我们随便创建一个脚本测试

public class Test_ZipWrapper : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){Zip zip = new Zip();//zip.CompressDirectory(, "D:/PowerModel/新建文件夹", 5,2048);zip.ZipFileDictory("D:/PowerModel/新建文件夹", "D:/PowerModel/新建文件夹.zip");//zip.Extract("D:/PowerModel/新建文件夹.zip", "D:/PowerModel/",2048);}}

在这里我们主要调用的是ZipFileDictory方法,两个固定参数和一个可选参数,一个是要打压缩包的路径,一个是压缩包保存的路径,可选参数就是压缩包是否要上密码,该代码随便挂一个物体上运行,可以看到我们成功了

 解压的话是用Extract,还是三个参数,要解压的压缩包路径、解压后的路径、和缓冲区,这个缓冲区和我们的TCP读流的缓冲区差不多,随便填,我这里填的是2048,你可以填别的数字,运行后,我们成功了

 大家快去试试吧!

来源:Unity 工具 之 (SharpZipLib) 实现文件Zip的压缩和解压((可代密码)可一次压缩多个文件/文件夹)-蒲公英云

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/19661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【设计模式——学习笔记】23种设计模式——命令模式Command(原理讲解+应用场景介绍+案例介绍+Java代码实现)

案例引入 有一套智能家电&#xff0c;其中有照明灯、风扇、冰箱、洗衣机&#xff0c;这些智能家电来自不同的厂家&#xff0c;我们不想针对每一种家电都安装一个手机App来分别控制&#xff0c;希望只要一个app就可以控制全部智能家电要实现一个app控制所有智能家电的需要&…

Jenkins 自动化部署实例讲解,另附安装教程!

【2023】Jenkins入门与安装_jenkins最新版本_丶重明的博客-CSDN博客 也可以结合这个互补看 前言 你平常在做自己的项目时&#xff0c;是否有过部署项目太麻烦的想法&#xff1f;如果你是单体项目&#xff0c;可能没什么感触&#xff0c;但如果你是微服务项目&#xff0c;相…

JVM的组件、自动垃圾回收的工作原理、分代垃圾回收过程、可用的垃圾回收器类型

详细画的图片 https://www.processon.com/diagraming/64c8aa11c07d99075d934311 官方网址 https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 相关概念 年轻代是所有新对象被分配和老化的地方。当年轻代填满时&#xff0c;这会导致minor …

Rust dyn - 动态分发 trait 对象

dyn - 动态分发 trait 对象 dyn是关键字&#xff0c;用于指示一个类型是动态分发&#xff08;dynamic dispatch&#xff09;&#xff0c;也就是说&#xff0c;它是通过trait object实现的。这意味着这个类型在编译期间不确定&#xff0c;只有在运行时才能确定。 practice tr…

《Spring Boot源码解读与原理分析》书籍推荐

Spring Boot 1.0.0 早在2014年就已经发布&#xff0c;只不过到了提倡“降本增效”的今天&#xff0c;Spring Boot才引起了越来越多企业的关注。Spring Boot是目前Java EE开发中颇受欢迎的框架之一。依托于底层Spring Framework的基础支撑&#xff0c;以及完善强大的特性设计&am…

设计模式之中介者模式

中介者模式 用一个中介对象来封装一系列的对象交互。中介者使得各对象不需要显示地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变他们之间的交互。 电脑主板的功能就类似于一个中介者 经典中介者模式UML 例子 经典的中介者模式 package com.tao.Ya…

Excel快捷键F1-F9详解:掌握实用快捷操作,提升工作效率

Excel是广泛应用于办公场景的优质电子表格软件&#xff0c;然而&#xff0c;许多人只是使用鼠标点击菜单和工具栏来完成操作&#xff0c;而忽略了快捷键的威力。在本文中&#xff0c;我们将详解Excel中的F1-F9快捷键&#xff0c;帮助您掌握实用的快捷操作&#xff0c;提升工作效…

leetcode(力扣)剑指 Offer 16. 数值的整数次方 (快速幂)

文章目录 题目描述思路分析完整代码 题目描述 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;10…

通向架构师的道路之Apache整合Tomcat

一、先从J2EE工程的通用架构说起 这是一个通用的Web即B/S工程的架构&#xff0c;它由&#xff1a; Web Server App Server DB Server 三大部分组成&#xff0c;其中&#xff1a; Web Server 置于企业防火墙外&#xff0c;这个防火墙&#xff0c;大家可以认为是…

c语言(函数)

目录 何为函数 库函数 自定义函数 二分查找数组下标 链式访问 函数的声明 函数定义 递归 正向打印数字 打印字符个数 使用临时变量 递归(不使用临时变量) n的阶乘 一般形式 递归 斐波那契数 递归 正常做法 何为函数 在计算机科学中&#xff0c;子程序是一个…

单片机外部晶振故障后自动切换内部晶振——以STM32为例

单片机外部晶振故障后自动切换内部晶振——以STM32为例 作者日期版本说明Dog Tao2023.08.02V1.0发布初始版本 文章目录 单片机外部晶振故障后自动切换内部晶振——以STM32为例背景外部晶振与内部振荡器STM32F103时钟系统STM32F407时钟系统 代码实现系统时钟设置流程时钟源检测…

spring AOP学习

概念 面向切面编程横向扩展动态代理 相关术语 动态代理 spring在运行期&#xff0c;生成动态代理对象&#xff0c;不需要特殊的编译器 Spring AOP的底层就是通过JDK动态代理或者CGLIb动态代理技术为目标Bean执行横向织入 目标对象实现了接口&#xff0c;spring使用JDK的ja…

Redis 集群 (cluster)

是什么 官网&#xff1a;Redis cluster specification | Redis 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作…

【机器学习】西瓜书习题3.5Python编程实现线性判别分析,并给出西瓜数据集 3.0α上的结果

参考代码 结合自己的理解&#xff0c;添加注释。 代码 导入相关的库 import numpy as np import pandas as pd import matplotlib from matplotlib import pyplot as plt导入数据&#xff0c;进行数据处理和特征工程 得到数据集 D { ( x i , y i ) } i 1 m , y i ∈ { 0 ,…

VR 变电站事故追忆反演——正泰电力携手图扑

VR(Virtual Reality&#xff0c;虚拟现实)技术作为近年来快速发展的一项新技术&#xff0c;具有广泛的应用前景&#xff0c;支持融合人工智能、机器学习、大数据等技术&#xff0c;实现更加智能化、个性化的应用。在电力能源领域&#xff0c;VR 技术在高性能计算机和专有设备支…

【机器学习】处理样本不平衡的问题

文章目录 样本不均衡的概念及影响样本不均衡的解决方法样本层面欠采样 &#xff08;undersampling&#xff09;过采样数据增强 损失函数层面模型层面采样集成学习 决策及评估指标 样本不均衡的概念及影响 机器学习中&#xff0c;样本不均衡问题经常遇到&#xff0c;比如在金融…

uniapp运行项目到iOS基座

2022年9月&#xff0c;因收到苹果公司警告&#xff0c;目前开发者已无法在iOS真机设备使用未签名的标准基座&#xff0c;所以现在要运行到 IOS &#xff0c;也需要进行签名。 Windows系统&#xff0c;HBuilderX 3.6.20以下版本&#xff0c;无法像MacOSX那样对标准基座进行签名…

选读SQL经典实例笔记16_逻辑否定

1. 示例数据 1.1. student insert into student values (1,AARON,20) insert into student values (2,CHUCK,21) insert into student values (3,DOUG,20) insert into student values (4,MAGGIE,19) insert into student values (5,STEVE,22) insert into student values (6…

伯俊ERP和金蝶云星空单据接口对接

伯俊ERP和金蝶云星空单据接口对接 对接源平台:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上&#xff0c;提供了标准的管理模式&#xff1b;通过标准的业务架构&#xff1a;多会计准则、多币别、多地点、多组织、多税制应用框架等&#xff0c;有效支持企业的运…

jenkins gitlab多分支构建发布

内容背景介绍 这个是新手教程,普及概念为主 公司现在还使用单分支发布测试环境和生产,多人协同开发同一个项目导致测试环境占用等待等情况 测试环境占用等待问题 测试环境代码直接合并到 master,容易导致误发布到生产的情况 避免多版本同时发布测试不完善的情况出现 中间件…