本人小鸟一只,请各位大神帮忙看下
using System.IO;
using System.Text;
using System.Xml;using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip; /// ;summary;
/// 解压缩一个 zip 文件。
/// ;/summary;
/// ;param name="zipFileName";要解压的 zip 文件。;/param;
/// ;param name="extractLocation";zip 文件的解压目录。;/param;
/// ;param name="password";zip 文件的密码。;/param;
/// ;param name="overWrite";是否覆盖已存在的文件。;/param;
public void UnZipDir(string zipFileName, string extractLocation, string password, bool overWrite)
{
#region 实现
string myExtractLocation = extractLocation;
if (myExtractLocation == "")
myExtractLocation = Directory.GetCurrentDirectory();
if (!myExtractLocation.EndsWith(@"\"))
myExtractLocation = myExtractLocation + @"\";
ZipInputStream s = new ZipInputStream(File.OpenRead(zipFileName));
s.Password = password;
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = "";
string pathToZip = "";
pathToZip = theEntry.Name; if (pathToZip != "")
directoryName = Path.GetDirectoryName(pathToZip) + @"\";
string fileName = Path.GetFileName(pathToZip);
Directory.CreateDirectory(myExtractLocation);
if (fileName != "")
{
try
{
if ((File.Exists(myExtractLocation + directoryName + fileName) && overWrite) || (!File.Exists(myExtractLocation + directoryName + fileName)))
{
FileStream streamWriter = File.Create(myExtractLocation + fileName);
int size = 2048;
byte[] data = new byte[2048];
while ( true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
break;
}
streamWriter.Close();
}
}
catch(ZipException ex)
{
FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "log.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(ex.Message);
}
}
}
s.Close();
#endregion
}这段代码是从网上找到的,自己使用时,当size的值小于2048时,再运行size = s.Read(data, 0, data.Length);就出错了
catch中的ZipExcetion为 "Size mismatch: 4294967295;1343 <-> 393;1343",根本看不懂...还请有经验的大神们指点下
using System.IO;
using System.Text;
using System.Xml;using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip; /// ;summary;
/// 解压缩一个 zip 文件。
/// ;/summary;
/// ;param name="zipFileName";要解压的 zip 文件。;/param;
/// ;param name="extractLocation";zip 文件的解压目录。;/param;
/// ;param name="password";zip 文件的密码。;/param;
/// ;param name="overWrite";是否覆盖已存在的文件。;/param;
public void UnZipDir(string zipFileName, string extractLocation, string password, bool overWrite)
{
#region 实现
string myExtractLocation = extractLocation;
if (myExtractLocation == "")
myExtractLocation = Directory.GetCurrentDirectory();
if (!myExtractLocation.EndsWith(@"\"))
myExtractLocation = myExtractLocation + @"\";
ZipInputStream s = new ZipInputStream(File.OpenRead(zipFileName));
s.Password = password;
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = "";
string pathToZip = "";
pathToZip = theEntry.Name; if (pathToZip != "")
directoryName = Path.GetDirectoryName(pathToZip) + @"\";
string fileName = Path.GetFileName(pathToZip);
Directory.CreateDirectory(myExtractLocation);
if (fileName != "")
{
try
{
if ((File.Exists(myExtractLocation + directoryName + fileName) && overWrite) || (!File.Exists(myExtractLocation + directoryName + fileName)))
{
FileStream streamWriter = File.Create(myExtractLocation + fileName);
int size = 2048;
byte[] data = new byte[2048];
while ( true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
break;
}
streamWriter.Close();
}
}
catch(ZipException ex)
{
FileStream fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "log.txt", FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(ex.Message);
}
}
}
s.Close();
#endregion
}这段代码是从网上找到的,自己使用时,当size的值小于2048时,再运行size = s.Read(data, 0, data.Length);就出错了
catch中的ZipExcetion为 "Size mismatch: 4294967295;1343 <-> 393;1343",根本看不懂...还请有经验的大神们指点下
新的问题是while ((theEntry = s.GetNextEntry()) != null) 到第二条数据时又有异常..用zipexception捕捉不到异常,用exception捕捉的异常为Unexcepted eof..
再烦请大神们指点下