微博粉丝精灵的升级解压一直用的ICSharpCode.SharpZipLib,解压缩程序代码是源用以前网上一堆一堆的代码,竟然有一个天大的Bug,根目录解压会失效,代码大致如下:
/**/
/// <summary>
/// 实现解压操作
/// </summary>
/// <param name="zipfilename">要解压文件Zip(物理路径)</param>
/// <param name="UnZipDir">解压目的路径(物理路径)</param>
/// <param name="password">解压密码</param>
/// <returns>异常信息</returns>
public static bool UnPack(string zipfilename, string UnZipDir, string password)
{
//判断待解压文件路径
if (!File.Exists(zipfilename))
{
return false;
}
//创建ZipInputStream
ZipInputStream newinStream = new ZipInputStream(File.OpenRead(zipfilename));
//判断Password
if (password != null && password.Length > 0)
{
newinStream.Password = password;
}
//执行解压操作
try
{
ZipEntry theEntry;
//获取Zip中单个File
while ((theEntry = newinStream.GetNextEntry()) != null)
{
//判断目的路径
if (!Directory.Exists(UnZipDir))
{
Directory.CreateDirectory(UnZipDir);//创建目的目录
}
//获得目的目录信息
string Driectoryname = Path.GetDirectoryName(UnZipDir);
string pathname = Path.GetDirectoryName(theEntry.Name);//获得子级目录
string filename = Path.GetFileName(theEntry.Name);//获得子集文件名
//处理文件盘符问题
pathname = pathname.Replace(":", "$");//处理当前压缩出现盘符问题
Driectoryname = Driectoryname + "\\" + pathname;
//创建
if (!Directory.Exists(Driectoryname))
{
Directory.CreateDirectory(Driectoryname);
}
//解压指定子目录
if (filename != string.Empty)
{
FileStream newstream = File.Create(Driectoryname + "\\" + filename);
int size = 2048;
byte[] newbyte = new byte[size];
while (true)
{
size = newinStream.Read(newbyte, 0, newbyte.Length);
if (size > 0)
{
//写入数据
newstream.Write(newbyte, 0, size);
}
else
{
break;
}
}
newstream.Close();
}
}
newinStream.Close();
}
catch (Exception se)
{
throw new Exception(se.Message);
}
finally
{
newinStream.Close();
}
return true;
}
以上代码算是网上比较普遍的,当然我也修改了一下,没想到这一堆一堆的代码,竟然有Bug,就是无法解压到根目录下去,直到最近,才发现了这个问题了,后来发现很简单的代码,记录一下,如下:
/// ;summary;
/// UnZip 类用于解压缩一个 zip 文件。
/// ;/summary;
public class UnZipDir
{
//解压缩以后的文件名和路径,压缩前的路径
public static Boolean UNZipFile(string FileToZip, string ZipedFile)
{
try
{
FastZip fastZip = new FastZip();
fastZip.ExtractZip(FileToZip, ZipedFile, "");
return true;
}
catch {
return false;
}
}
public static Boolean ZipFile(string FileToZip, string ZipedFile)
{
try
{
FastZip fastZip = new FastZip();
bool recurse = true;
//压缩后的文件名,压缩目录 ,是否递归
fastZip.CreateZip(FileToZip, ZipedFile, recurse, "");
return true;
}
catch { return false; }
}
}
以上代码就几行,而且可解决根目录失效的问题,因此,赶紧换上了代码,修正了Bug。
真是人算不如天算,这Bug隐藏了太久了。