今天,我们来写写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通用工具类之解压缩文件的更多相关文章

  1. Unity3d通用工具类之生成文件的MD5

    今天我们来写写工具类,这个类有什么用呢? 也就是无论你做什么项目,这个工具类你都可以拿来用,之所以通用,是可以适用所有项目. 这节我主要讲如何生成文件的MD5码. 那么这个MD5是个什么鬼东西,读者可 ...

  2. Unity3d通用工具类之NGUI图集分解

    ---恢复内容开始--- Unity3d通用工具类之NGUI图集分解 由于最近需要一些美术资源吗,但是无奈自己不会制作UI,所以就打算去网上的项目中直接找几张可以使用的贴图资源. 但是发现这些资源已经 ...

  3. Unity3d通用工具类之数据配置加载类-ini配置文件加载

    Unity3d通用工具类之数据配置加载类-ini配置文件加载 上次我们讲过xml文件的加载配置管理,今天我们换个配置文件,也是比较常见的配置文件.ini格式的数据. 按照国际管理先贴一张啥是.ini文 ...

  4. Unity3d通用工具类之数据配置加载类

    今天,我们来讲讲游戏中的数据配置加载. 什么是游戏数据加载呢?一般来说游戏中会有场景地图. 按照国际惯例,先贴一张游戏场景的地图: 在这张地图上,我们可以看到有很多正六边形,正六边形上有树木.岩石等. ...

  5. Unity3d通用工具类之定时触发器

    时隔多日,好不容易挤出点时间来写写博文.不容易,请送我几朵红花,点个赞也行. 今天呢,我们主要来扩展下通用工具类==>定时触发器. 顾名思义,所谓的定时触发器,就是告诉程序在过多长时间后,我要执 ...

  6. ZIP解压缩文件的工具类【支持多级文件夹|全】

    ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...

  7. ZIP解压缩文件的工具类【支持多级目录|全】

    ZIP解压缩文件的工具类[支持多级目录|全] 作者:Vashon 网上有很多的加压缩示例代码,但是都只是支持一级目录的操作,如果存在多级目录的话就不行了.本解压缩工具类经过多次检查及重构,最终分享给大 ...

  8. java 实现视频转换通用工具类:视频截图-Ffmpeg(四)

    java 实现视频转换通用工具类:获取视频元数据信息(一) java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二) java 实现视频转换通用工具类:视频相互转换-Ffmpeg ...

  9. java 实现视频转换通用工具类:视频相互转换-Ffmpeg(三)

    java 实现视频转换通用工具类:获取视频元数据信息(一) java 实现视频转换通用工具类:视频相互转换-总方法及Mencoder(二) 这节主要是ffmpeg的相关方法封装,在实际调用中主要使用f ...

随机推荐

  1. vim的各种tips

    centos系统,修改vim的配置文件 /etc/vimrc 添加如下内容: 1) 打开 vimrc ,添加以下语句来使得语法高亮显示: syntax on 2) 如果此时语法还是没有高亮显示,那么在 ...

  2. MyBatis批量插入数据(MySql)

    由于项目需要生成多条数据,并保存到数据库当中,在程序中封装了一个List集合对象,然后需要把该集合中的实体插入到数据库中,项目使用了Spring+MyBatis,所以打算使用MyBatis批量插入,应 ...

  3. Linux平台用C++实现事件对象,同步线程(转)

    本文属于转载,原文链接如下:http://blog.csdn.net/chexlong/article/details/7080537 与其相关的一组API包括:pthread_mutex_init, ...

  4. 自定制Form组件

    代码 import re import copy class ValidateError(Exception): def __init__(self,detail): self.detail = de ...

  5. <一>dubbo框架学前原理介绍

    alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo.hsf),jms消息服务(napoli.notify),KV数据库(tair)等.这个框架/工具/产 ...

  6. AC日记——Dynamic Ranking 洛谷 P2617

    Dynamic Ranking 思路: 可持久化树状数组: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 1 ...

  7. AC日记——可怜的狗狗 洛谷 P1533

    可怜的狗狗 思路: 主席树第k大: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300001 #defin ...

  8. [译]怎样在Vue.js中使用jquery插件

    原文:http://gambardella.info/2016/09/05/guide-how-to-use-vue-js-with-jquery-plugins 使用Vue真的太棒了,但是也有可能使 ...

  9. 解决Django在mariadb创建的表插入中文乱码的问题

    1.确保你的mariadb数据库的character_set_connection.character_set_database.character_set_server的编码均为utf8 Maria ...

  10. 2017CCPC 杭州 J. Master of GCD【差分标记/线段树/GCD】

    给你一个n个初始元素都为1的序列和m个询问q. 询问格式为:l r x(x为2or3) 最后求1~n所有数的GCD GCD:把每个数分别分解质因数,再把各数中的全部公有质因数提取出来连乘,所得的积就是 ...