using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using ICSharpCode.SharpZipLib.Zip;
using UnityEngine;
public class UnZipThread
{
public Thread thread;
private UnZipThreadPool unZipThreadPool;
private string unPath;
private byte[] zipData = new byte[2048];
public bool isUnEnd;
private bool isUpdateEnd;
public void InitUnZip(UnZipThreadPool unZipThreadPool)
{
this.unZipThreadPool = unZipThreadPool;
unPath = unZipThreadPool.unPath;
isUpdateEnd = true;
thread = new Thread(ThreadUpdate);
thread.Start();
}
private void ThreadUpdate()
{
while (isUpdateEnd)
{
try
{
ZipEntry ze = null;
Stream stream = null;
lock (unZipThreadPool.allZipFile)
{
if (unZipThreadPool.allZipFile.Count > 0)
{
ze = unZipThreadPool.allZipFile[0];
unZipThreadPool.allZipFile.Remove(ze);
stream = unZipThreadPool.zipFile.GetInputStream(ze);
}
}
if (ze == null)
{
Thread.Sleep(1000);
return;
}
isUnEnd = false;
UnzipFile(ze, stream, unPath);
}
catch (Exception e)
{
Debug.LogError("解压失败");
}
isUnEnd = true;
Thread.Sleep(10);
}
}
public void Cloas()
{
isUpdateEnd = false;
thread = null;
}
private void UnzipFile(ZipEntry zip, Stream stream, string dirPath)
{
FileStream fileStream = null;
try
{
//文件名不为空
if (!string.IsNullOrEmpty(zip.Name))
{
string filePath = dirPath;
string[] files = zip.Name.Split('/');
// if (files.Length < 2)
// {
// return;
// }
filePath += "/" + files[files.Length - 1];
//如果是一个新的文件路径 这里需要创建这个文件路径
if (IsDirectory(filePath))
{
Debug.Log("Create file paht " + filePath);
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
}
}
else
{
if (File.Exists(filePath))
{
File.Delete(filePath);
}
fileStream = File.Create(filePath);
// Debug.Log(filePath);
// MemoryStream ms = new MemoryStream();
int size = 0;
//每次读取2MB 直到把这个内容读完
while (true)
{
size = stream.Read(zipData, 0, zipData.Length);
//小于0, 也就读完了当前的流
if (size > 0)
{
unZipThreadPool.currSize += size;
fileStream.Write(zipData, 0, size);
}
else
{
break;
}
}
fileStream.Flush();
fileStream.Close();
fileStream.Dispose();
fileStream = null;
}
}
}
catch (Exception e)
{
if (fileStream != null)
{
fileStream.Close();
fileStream.Dispose();
}
fileStream = null;
Debug.LogError("解压错误" + zip.Name);
Debug.Log(e);
}
}
///
/// 判断是否是目录文件
///
///
///
private bool IsDirectory(string path)
{
if (path[path.Length - 1] == '/')
{
return true;
}
return false;
}
}
public class UnZipThreadPool
{
public string unPath;
public float jd
{
get { return currSize / maxSize; }
}
public float currSize;
public bool isEnd
{
get
{
bool isCount = false;
lock (allZipFile)
{
if (allZipFile.Count <= 0)
{
isCount = true;
}
}
if (isCount)
{
for (int i = 0; i < _zipThreads.Count; i++)
{
if (!_zipThreads[i].isUnEnd)
{
return false;
}
}
return true;
}
return false;
}
}
public float maxSize;
public ZipFile zipFile;
public List allZipFile = new List();
private List _zipThreads = new List();
public int CurrCount()
{
lock (allZipFile)
{
return allZipFile.Count;
}
}
private FileStream fileStream;
public void InitUnZip(byte[] zipData, string unPath)
{
this.unPath = unPath;
maxSize = zipData.Length;
MemoryStream ms = new MemoryStream(zipData);
zipFile = new ZipFile(ms);
IEnumerator ie = zipFile.GetEnumerator();
while (ie.MoveNext())
{
allZipFile.Add((ZipEntry) ie.Current);
}
for (int i = 0; i < 8; i++)
{
UnZipThread u = new UnZipThread();
u.InitUnZip(this);
_zipThreads.Add(u);
}
}
public void InitUnZip(string filePath, string unPath)
{
if (!Directory.Exists(unPath))
{
Directory.CreateDirectory(unPath);
}
this.unPath = unPath;
fileStream = new FileStream(filePath, FileMode.Open);
zipFile = new ZipFile(fileStream);
IEnumerator ie = zipFile.GetEnumerator();
while (ie.MoveNext())
{
allZipFile.Add((ZipEntry) ie.Current);
}
maxSize = allZipFile.Count;
for (int i = 0; i < 4; i++)
{
UnZipThread u = new UnZipThread();
u.InitUnZip(this);
_zipThreads.Add(u);
}
}
public void Cloas()
{
for (int i = 0; i < _zipThreads.Count; i++)
{
_zipThreads[i].Cloas();
}
if (fileStream != null)
{
fileStream.Close();
fileStream.Dispose();
}
allZipFile.Clear();
fileStream = null;
}
// public void UnzipWithPath()
// {
// Debug.Log("dirpath is:" + unPath);
// //ZipEntry:文件条目 就是该目录下所有的文件列表(也就是所有文件的路径)
// ZipEntry zip = null;
// //输入的所有的文件流都是存储在这里面的
// ZipInputStream zipInStream = null;
//
// MemoryStream ms = new MemoryStream(zipData);
//
// //读取文件流到zipInputStream
// zipInStream = new ZipInputStream(ms);
//
// int topSize = zipData.Length;
//
// int countCount = 0;
//
// //循环读取Zip目录下的所有文件
// while ((zip = zipInStream.GetNextEntry()) != null)
// {
// // Debug.Log("name is:" zip.Name " zipStream " zipInStream);
// UnzipFile(zip, zipInStream, unPath);
// countCount++;
// jd = currSize * 1.0f / topSize;
// if (countCount > 20)
// {
// countCount = 0;
// Thread.Sleep(10);
// }
// }
//
// zipInStream.Close();
// isEnd = true;
// }
//
// private void UnzipFile(ZipEntry zip, ZipInputStream zipInStream, string dirPath)
// {
// try
// {
// //文件名不为空
// if (!string.IsNullOrEmpty(zip.Name))
// {
// string filePath = dirPath;
// string[] files = zip.Name.Split('/');
// if (files.Length < 2)
// {
// return;
// }
//
// filePath += "/" + files[files.Length - 1];
//
//
// //如果是一个新的文件路径 这里需要创建这个文件路径
// if (IsDirectory(filePath))
// {
// Debug.Log("Create file paht " + filePath);
// if (!Directory.Exists(filePath))
// {
// Directory.CreateDirectory(filePath);
// }
// }
// else
// {
// MemoryStream ms = new MemoryStream();
//
// int size = 0;
//
// //每次读取2MB 直到把这个内容读完
// while (true)
// {
// size = zipInStream.Read(zipData, 0, zipData.Length);
// //小于0, 也就读完了当前的流
// if (size > 0)
// {
// currSize += size;
// ms.Write(zipData, 0, size);
// }
// else
// {
// break;
// }
// }
//
// ms.Flush();
// byte[] fileData = ms.ToArray();
// File.WriteAllBytes(filePath, fileData);
// if (zip.Name.Contains("md5File"))
// {
// File.WriteAllBytes(md5Path, fileData);
// }
//
// ms.Close();
// ms.Dispose();
// }
// }
// }
// catch (Exception e)
// {
// Debug.LogError("解压错误"+zip.Name);
// Debug.Log(e);
// }
// }
//
// ///
// /// 判断是否是目录文件
// ///
// ///
// ///
// private bool IsDirectory(string path)
// {
// if (path[path.Length - 1] == '/')
// {
// return true;
// }
//
// return false;
// }
}