Unity3d通用工具类之解压缩文件
今天,我们来写写c#是如何通过代码解压缩文件的。
在游戏的项目中呢,常常我们需要运用到解压缩的技术。比如,当游戏需要更新的时候,我们会从服务器中下载更新的压缩文件包。
这时候我们就需要解压文件,然后覆盖添加到游戏文件夹去,实现游戏的更新。
通常我们就需要通过代码来实现这一功能。
那么这里呢,我用的是第三发的压缩库,这个是用到一个dll,也就是ICSharpCode.SharpZipLib.Zip.dll
读者可以自行百度下载,这里我提供链接给你们:
http://pan.baidu.com/s/1ntqx6cT
往事具备,只欠代码:
我们先来讲讲怎么解压文件,这里我只写Zip的解压方式,其实只要掌握一种解压技术就行。
public static void DecompressToDirectory(string targetPath, string zipFilePath)//targetPath是我们解压到哪里,zipFilePath是我们的zip压缩文件目录(包括文件名和后缀)
{
if (File.Exists(zipFilePath))
{
var compressed = File.OpenRead(zipFilePath);
compressed.DecompressToDirectory(targetPath);
}
else
{
LoggerHelper.Error("Zip不存在: " + zipFilePath);
}
}
public static void DecompressToDirectory(this Stream source, string targetPath)//自己写stream的扩展方法,不懂的童鞋自行百度什么是扩展方法
{
targetPath = Path.GetFullPath(targetPath);
using (ZipInputStream decompressor = new ZipInputStream(source))
{
ZipEntry entry; while ((entry = decompressor.GetNextEntry()) != null)
{
string name = entry.Name;
if (entry.IsDirectory && entry.Name.StartsWith("\\"))
name = entry.Name.ReplaceFirst("\\", ""); string filePath = Path.Combine(targetPath, name);
string directoryPath = Path.GetDirectoryName(filePath); if (!string.IsNullOrEmpty(directoryPath) && !Directory.Exists(directoryPath))
Directory.CreateDirectory(directoryPath); if (entry.IsDirectory)
continue; byte[] data = new byte[];
using (FileStream streamWriter = File.Create(filePath))
{
int bytesRead;
while ((bytesRead = decompressor.Read(data, , data.Length)) > )
{
streamWriter.Write(data, , bytesRead);
}
}
}
}
}
ok,代码写完了,同样,我们放到Utils通用工具类内。
只需要一句代码:Utils.DecompressToDirectory(targetPath, zipFileName);
就可以实现文件的解压啦!是不是很简单!
OK,讲完解压文件,我们来讲讲压缩文件。其实也和解压文件类似,都是通过文件流来进行处理:
/// <summary>
/// 压缩文件
/// </summary>
/// <param name="filePath">zip文件路径</param>
/// <param name="zipPath">压缩到哪个文件路径</param>
public static void ZipFile(string filePath, string zipPath)
{
if (!File.Exists(filePath))
{
Debug.LogError("需要压缩的文件不存在");
}
string zipFileName = zipPath + Path.GetFileNameWithoutExtension(filePath) + ".zip";
Debug.Log(zipFileName);
using (FileStream fs = File.Create(zipFileName))
{
using (ZipOutputStream zipStream = new ZipOutputStream(fs))
{
using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
string fileName = Path.GetFileName(filePath);
ZipEntry zipEntry = new ZipEntry(fileName);
zipStream.PutNextEntry(zipEntry);
byte[] buffer = new byte[1024];
int sizeRead = 0;
try
{
do
{
sizeRead = stream.Read(buffer, 0, buffer.Length);
zipStream.Write(buffer, 0, sizeRead);
} while (sizeRead > 0);
}catch(Exception e)
{
Debug.LogException(e);
}
stream.Close();
}
zipStream.Finish();
zipStream.Close();
}
fs.Close();
}
}
Unity3d通用工具类之解压缩文件的更多相关文章
- Unity3d通用工具类之生成文件的MD5
今天我们来写写工具类,这个类有什么用呢? 也就是无论你做什么项目,这个工具类你都可以拿来用,之所以通用,是可以适用所有项目. 这节我主要讲如何生成文件的MD5码. 那么这个MD5是个什么鬼东西,读者可 ...
- Unity3d通用工具类之NGUI图集分解
---恢复内容开始--- Unity3d通用工具类之NGUI图集分解 由于最近需要一些美术资源吗,但是无奈自己不会制作UI,所以就打算去网上的项目中直接找几张可以使用的贴图资源. 但是发现这些资源已经 ...
- Unity3d通用工具类之数据配置加载类-ini配置文件加载
Unity3d通用工具类之数据配置加载类-ini配置文件加载 上次我们讲过xml文件的加载配置管理,今天我们换个配置文件,也是比较常见的配置文件.ini格式的数据. 按照国际管理先贴一张啥是.ini文 ...
- Unity3d通用工具类之数据配置加载类
今天,我们来讲讲游戏中的数据配置加载. 什么是游戏数据加载呢?一般来说游戏中会有场景地图. 按照国际惯例,先贴一张游戏场景的地图: 在这张地图上,我们可以看到有很多正六边形,正六边形上有树木.岩石等. ...
- Unity3d通用工具类之定时触发器
时隔多日,好不容易挤出点时间来写写博文.不容易,请送我几朵红花,点个赞也行. 今天呢,我们主要来扩展下通用工具类==>定时触发器. 顾名思义,所谓的定时触发器,就是告诉程序在过多长时间后,我要执 ...
- ZIP解压缩文件的工具类【支持多级文件夹|全】
ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...
- ZIP解压缩文件的工具类【支持多级目录|全】
ZIP解压缩文件的工具类[支持多级目录|全] 作者:Vashon 网上有很多的加压缩示例代码,但是都只是支持一级目录的操作,如果存在多级目录的话就不行了.本解压缩工具类经过多次检查及重构,最终分享给大 ...
- java 实现视频转换通用工具类:视频截图-Ffmpeg(四)
java 实现视频转换通用工具类:获取视频元数据信息(一) java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二) java 实现视频转换通用工具类:视频相互转换-Ffmpeg ...
- java 实现视频转换通用工具类:视频相互转换-Ffmpeg(三)
java 实现视频转换通用工具类:获取视频元数据信息(一) java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二) 这节主要是ffmpeg的相关方法封装,在实际调用中主要使用f ...
随机推荐
- 使用JMX工具远程监控tomcat配置
使用JMX工具远程监控tomcat,在tomcat启动时添加配置参数: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.po ...
- git 查看父分支
// 显示本地分支和服务器分支的映射关系 git branch -vv // 切换分支(和创建分支就差一个-b参数) git checkout {{branch_name}} // 创建新分支,新分支 ...
- iis频繁奔溃,求大神帮忙分析dump
直接上图了 上图三个错误最近频繁出现,出现一次iis就奔溃一次,抓取的dump分析后如下: Couldn't resolve error at 'ls' :> !analyze -v ***** ...
- javascript大神修炼记(4)——循环
读者朋友们大家好,今天,我们继续接着前面的内容讲,前们我们已经讲了条件分支,今天我们就讲循环,顾名思义就是,重复执行相同的操作,正常循环是受程序控制的,不正常的情况,就会出现死循环,那就是我们的代码中 ...
- hdu 1556 Color the ball(线段树区间维护+单点求值)
传送门:Color the ball Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/3276 ...
- HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 循序渐进PYTHON3(十三) --2-- DJANGO之FORM表单(自动生成HTML标签和自定制提示信息)
在上一次的代码上做出进一步修改,使之能在页面上显示自定制的报错信息,并且使用form自动创建标签的功能. views.py from django.shortcuts import render,Ht ...
- 洛谷——P2908 [USACO08OPEN]文字的力量Word Power
P2908 [USACO08OPEN]文字的力量Word Power 题目描述 Farmer John wants to evaluate the quality of the names of hi ...
- Flask实战第61天:帖子板块过滤显示
先在显示的帖子是所有版块的帖子,这节我们来完成点击某个版块,则显示此版块的帖子 要完成这个功能,我们需要在前端传递板块的id到后台, 编辑front_index.html 编辑首页视图 编辑板块选中样 ...
- Xamarin Android真机测试报错
Xamarin Android真机测试报错 Xamarin Android真机测试报错,错误信息为INSTALL_CANCELLED_BY_USER.出现这个错误,通常都是真机上开发者选项设置错误 ...