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;相…

okhttp异步get和post请求,实现读取获取、增加http文件数据

Okhttp类&#xff0c;封装方法 package com.example.httptest;import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.util.Log;import androidx.annotation.NonNull;import com.google.gso…

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

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

【Rust 基础篇】Rust Never类型:表示不会返回的类型

导言 Rust是一种以安全性和高效性著称的系统级编程语言&#xff0c;其设计哲学是在不损失性能的前提下&#xff0c;保障代码的内存安全和线程安全。在Rust中&#xff0c;Never类型是一种特殊的类型&#xff0c;它表示一个函数永远不会返回。Never类型在Rust中有着重要的应用场…

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…

Linux用户权限信息、chmod以及chown命令

权限修改 权限信息chmod命令chown命令 权限信息 在Linux系统中&#xff0c;每个文件和目录都包含了权限信息&#xff0c;用于控制对其的访问权限。 文件权限&#xff1a;Linux系统中的文件权限由三组权限表示&#xff0c;分别是所有者权限、组权限和其他用户权限。 所有者权…

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;子程序是一个…

150. 逆波兰表达式求值

150. 逆波兰表达式求值 题目-中等难度示例1. 字典存储function2. if-else 题目-中等难度 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 ‘’、‘-’…

华为数通HCIA-实验环境ensp简介

ensp 路由器&#xff1a;AR系列、NE系列&#xff1b; 模拟器中使用AR2220&#xff1b; 交换机&#xff1a;S系列、CE系列&#xff1b; 模拟器中使用S5700&#xff1b; 线缆&#xff1a;copper——以太网链路&#xff1b; serial——串行链路&#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 技术在高性能计算机和专有设备支…