日期:2014-05-18  浏览次数:21099 次

我在使用ICSharpCode.SharpZipLib进行目录压缩后,再解压缩是提示这个错误
我在使用ICSharpCode.SharpZipLib进行目录压缩后,再解压缩是提示这个错误:
Size mismatch: 4294967295;126976 <-> 70202;126976
是在执行这句时: size = s.Read(data, 0, data.Length);//读入一个压缩块
报的错误。
我的源代码如下
//压缩
  /// 
  /// 递归压缩文件夹方法
  private static bool ZipFileDictory(string FolderToZip, ZipOutputStream s, string ParentFolderName)
  {
  bool res = true;
  string[] folders, filenames;
  ZipEntry entry = null;
  FileStream fs = null;
  Crc32 crc = new Crc32();
  try
  {//创建当前文件夹
  entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/")); //加上 “/” 才会当成是文件夹创建
  s.PutNextEntry(entry);
  s.Flush();
  //先压缩文件,再递归压缩文件夹 
  filenames = Directory.GetFiles(FolderToZip);
  foreach (string file in filenames)
  {
  //打开压缩文件
  fs = File.OpenRead(file);

  byte[] buffer = new byte[fs.Length];
  fs.Read(buffer, 0, buffer.Length);
  entry = new ZipEntry(Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip) + "/" + Path.GetFileName(file)));

  entry.DateTime = DateTime.Now;
  entry.Size = fs.Length;
  fs.Close();
  crc.Reset();
  crc.Update(buffer);
  entry.Crc = crc.Value;
  s.PutNextEntry(entry);
  s.Write(buffer, 0, buffer.Length);
  }
  }
  catch
  {
  res = false;
  }
  finally
  {
  if (fs != null)
  {
  fs.Close();
  fs = null;
  }
  if (entry != null)
  {
  entry = null;
  }
  GC.Collect();
  GC.Collect(1);
  }


  folders = Directory.GetDirectories(FolderToZip);
  foreach (string folder in folders)
  {
  if (!ZipFileDictory(folder, s, Path.Combine(ParentFolderName, Path.GetFileName(FolderToZip))))
  {
  return false;
  }
  }

  return res;
  }
  /// 
  /// 压缩目录
  /// 
  /// 待压缩的文件夹,全路径格式
  /// 压缩后的文件名,全路径格式
  /// 
  private static bool ZipFileDictory(string FolderToZip, string ZipedFile, String Password)
  {
  bool res;
  if (!Directory.Exists(FolderToZip))
  {
  return false;
  }

  ZipOutputStream s = new ZipOutputStream(File.Create(ZipedFile));
  s.SetLevel(9);
  s.Password = Password;

  res = ZipFileDictory(FolderToZip, s, "");

  s.Finish();