using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using ICSharpCode.SharpZipLib.Zip; namespace Unzip
{
class UnzipCore
{
///配置为 QueueUserWorkItem 或 Task.Factory.StartNew,两者速度差不多
public static void UnZip(string zipFullName, string targetPath)
{
if (!Directory.Exists(targetPath))
Directory.CreateDirectory(targetPath);
int size = 1024;
byte[] data = new byte[size];
string fileName = null;
FileStream fs = null;
ZipInputStream zs = null;
List<string> files = new List<string>();
try
{
fs = new FileStream(zipFullName, FileMode.Open, FileAccess.ReadWrite);
zs = new ZipInputStream(fs);
ZipEntry theEntry; while ((theEntry = zs.GetNextEntry()) != null)
{
fileName = theEntry.Name; if (fileName.IndexOf(":") > -1)
{
fileName = fileName.Replace(":", "_");
}
if (fileName.IndexOf("/") > -1)
{
fileName = fileName.Replace("/", "\\");
}
if (theEntry.IsDirectory)
{
if (!Directory.Exists(Path.Combine(targetPath, fileName)))
Directory.CreateDirectory(Path.Combine(targetPath, fileName));
}
else
{
string fullname = Path.Combine(targetPath, fileName);
if (files.Count(f => f.ToLower().StartsWith(Path.GetDirectoryName(fullname).ToLower())) == 0)
{
Directory.CreateDirectory(Path.GetDirectoryName(fullname));
}
files.Add(fullname);
//该方式降低解压速度6倍以上
//using (var ws = File.Create(fullname))
//{
// size = zs.Read(data, 0, data.Length);
// while (size > 0)
// {
// ws.Write(data, 0, size);
// size = zs.Read(data, 0, data.Length);
// }
//}
List<byte> bytes = new List<byte>();
size = zs.Read(data, 0, data.Length);
while (size > 0)
{
bytes.AddRange(data);
size = zs.Read(data, 0, data.Length);
}
var ws = new FileStream(fullname, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite, 1024, true);
ws.BeginWrite(bytes.ToArray(), 0, bytes.Count, new AsyncCallback(EndWriteCallback), ws);
}
}
}
catch
{
throw;
}
finally
{
if (zs != null) zs.Close();
if (fs != null) fs.Close();
}
}
static void EndWriteCallback(IAsyncResult result)
{
FileStream stream = (FileStream)result.AsyncState;
stream.EndWrite(result);
stream.Flush();
stream.Close();
}
}
}
在没有异步的情况下,配置如下,均无法提高解压速度
System.Threading.ThreadPool.SetMinThreads(Environment.ProcessorCount*20, Environment.ProcessorCount*20);
System.Diagnostics.Process.GetCurrentProcess().PriorityBoostEnabled = true;
System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.High;