当前位置: 首页 > news >正文

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的压缩和解压((可代密码)可一次压缩多个文件/文件夹)-蒲公英云

相关文章:

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

1、简单介绍&#xff1a; 用的是一个插件SharpZipLib&#xff0c;在vs的Nuget下载&#xff0c;也可以去github下载https://github.com/icsharpcode/SharpZipLib 用这个最主要的是因为&#xff0c;这个不用请求windows的文件读写权限&#xff0c;关于这个权限我搞了好久&#…...

【iOS】—— UIKit相关问题

文章目录 UIKit常用的UIKit组件懒加载的优势 CALayer和UIView区别关系 UITableViewUITableView遵循的两个delegate以及必须实现的方法上述四个必须实现方法执行顺序其他方法的执行顺序&#xff1a; UICollectionView和UITableView的区别UICollectionViewFlowLayout和UICollecti…...

Linux系统防火墙Firewalld

目录 Firewalld概述 Firewalld和iptables的区别 Firewalld网络区域 区域介绍与概念 9个预定义区域 Firewalld数据处理流程 firewalld检查数据包的源地址的规则 Firewalld防火墙的配置方式 常用的firewall-cmd命令选项 服务管理 端口管理 Firewalld概述 Firewalld防火…...

STM3232 GPIO的配置寄存器(为了移植IIC)

参考 https://blog.csdn.net/qq_45539458/article/details/129481019 https://blog.csdn.net/weixin_43314829/article/details/125573448?spm1001.2014.3001.5502 https://blog.csdn.net/m0_71548440/article/details/125894236?spm1001.2014.3001.5502 正点原子mini板 stm…...

K8s的详细介绍

1.编写yaml文件的方式 2.yaml里面的内容介绍 Pod实现机制&#xff1a;&#xff08;1&#xff09;共享网络&#xff08;2&#xff09;共享存储 共享网络:通过Pause容器&#xff0c;把其他业务容器加入到Pause容器里面&#xff0c;让所有业务容器在同一个名称空间中&#xff0c;…...

JavaWeb(8)——前端综合案例2(节流和防抖)

目录 一、节流和防抖概念 &#x1f680; 二、实例演示 &#x1f498; 三、需要注意的 &#x1f4e1; 一、节流和防抖概念 &#x1f680; 二、实例演示 &#x1f498; Lodash 简介 | Lodash中文文档 | Lodash中文网 (lodashjs.com) <!DOCTYPE html> <html lang&q…...

Spring优雅的在事务提交/回滚前后插入业务逻辑

业务背景 业务那边想要统计下我们这边每天注册商户成功和失败的数量&#xff0c;你看看怎么给他弄下这个功能 功能实现 TransactionSynchronizationManager.registerSynchronization&#xff0c;发现这是spring事务提供的注册回调接口的方法。 在事务注解方法中&#xff0c…...

day48-ajax+SSM分页

AjaxSSM分页 非分页版controller及html&#xff1a; 分页模糊查询controller&#xff1a; Postman测试&#xff08;无网页&#xff09;&#xff1a; 分页网页&#xff1a; 分页网页中添加模糊查询&#xff1a; 分页网页中实现添加功能&#xff1a; &#xff08;1&am…...

如何在本地环境使用 CodeQL 扫描出代码中的安全漏洞?

CodeQL 是什么&#xff1f; CodeQL 是用于自动执行安全检查的分析引擎。在 CodeQL 中&#xff0c;代码被视为数据。 安全漏洞、bug 和其他错误被建模为可针对从代码中提取的数据库执行的查询。可以运行由 Github 研究人员和社区参与者编写的标准 CodeQL 查询&#xff0c;也可以…...

关于领导要求logback日志时间格式要求为“年-月-日 时:分:秒,毫秒”

今天接到领导邮件要求整改系统输出日志规范&#xff0c;有一条要求调整输出日志时间格式为标题所述格式&#xff0c;例&#xff1a;2022-02-21 14:13:32,489 项目目前logback.xml里的配置是这样&#xff1a; <pattern>%d{yyyyMMdd hh:mm:ss} [%p][%c][%M][%L]-> %m%…...

软件测试--一些生命周期

目录 1.需求生命周期 2.开发生命周期 3.测试生命周期 4.缺陷声生命周期 1.需求生命周期 需求生命周期是指在软件测试过程中&#xff0c;需求从提出到最终完成的整个过程。它涵盖了需求的识别、分析、定义、验证和管理等阶段。 需求识别&#xff1a;在此阶段&#xff0c;项目…...

Mr. Cappuccino的第57杯咖啡——简单手写Mybatis大致原理

简单手写Mybatis大致原理 大致原理项目结构项目代码代码测试 大致原理 底层基于JDK动态代理技术实现 项目结构 项目代码 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns…...

机房环境、动力、网络、安防,帮您提高运维效率,确保机房安全

机房作为单位的核心部门&#xff0c;由计算机、服务器、网络设备、存储设备等关键设备组成&#xff0c;智能化计算机机房这个概念在各个领域中&#xff0c;已经占据了很重要的地位&#xff0c;伴随着国家大力倡导的&#xff0c;东数西算&#xff0c;数字经济、云计算、5G大数据…...

大数据课程E1——Flume的概述

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Ganglia的概念; ⚪ 了解Ganglia的拓扑结构和执行流程; ⚪ 掌握Ganglia的安装操作; 一、简介 1. 概述 1. Flume原本是由Cloudera公司开发的后来贡献给了Apache的一套分布式的、可…...

01.Redis实现发送验证码

学习目标&#xff1a; 提示&#xff1a;学习如何利用Redis来实现发送验证码功能 学习产出&#xff1a; 1. 准备pom环境 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><…...

Vue中对组件的调用

在Vue中&#xff0c;你可以在一个页面中调用其他组件&#xff0c;以实现组件的复用和组合效果。以下是在Vue中实现调用页面组件的几种常见方法之一&#xff1a; 1.使用Vue的组件标签&#xff1a; 你可以在Vue的模板中使用已注册的组件标签&#xff0c;以调用和渲染其他组件。首…...

SpringCloud Gateway获取请求响应body大小

前提 本文获取请求、响应body大小方法的前提 : 网关只做转发逻辑&#xff0c;不修改请求、相应的body内容。 SpringCloud Gateway内部的机制类似下图&#xff0c;HttpServer&#xff08;也就是NettyServer&#xff09;接收外部的请求&#xff0c;在Gateway内部请求将会通过Htt…...

二叉树的层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09; 。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例 2&#xff1a; 输入…...

Spring Boot 集成 Thymeleaf 模板引擎

Spring Boot 集成 Thymeleaf 模板引擎 1. Thymeleaf 介绍 Thymeleaf 是适用于 Web 和独立环境的现代服务器端 Java 模板引擎。 Thymeleaf 的主要目标是为开发工作流程带来优雅的自然模板&#xff0c;既可以在浏览器中正确显示的 HTML&#xff0c;也可以用作静态原型&#xff…...

如何快速找到合适的工作?

前面好几篇文章都在写面试的感悟&#xff0c;带大家了解了目前的一些市场行情&#xff0c;以及面试过程中招聘方与求职者看待面试的不同视角。 今天这篇文章写一些对大家求职面试可能更有用的几条建议&#xff1a; 第一&#xff0c;值与量的权衡 在早些年&#xff0c;大多数…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...