问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助,ICSharpCode.SharpZipLib.Zip 如何进行分段压缩

发布网友 发布时间:2022-05-02 11:28

我来回答

2个回答

懂视网 时间:2022-05-19 14:49

前面介绍了六种.NET组件,其中有一种组件是写文件的压缩和解压,现在介绍另一种文件的解压缩组件SharpZipLib。在这个组件介绍系列中,只为简单的介绍组件的背景和简单的应用,读者在阅读时可以结合官网的相关介绍和在本地实际操作。

相关的组件功能非常强大,在笔者的介绍中只是提及到简单的应用,需要了解更多的操作和特性,可以根据官网介绍,或者查看DLL文件的相关类和方法,以此来扩展相关的业务需要。

SharpZipLib是一个完全在C#中为.NET平台编写的Zip,GZip,Tar和BZip2库。

一.SharpZipLib组件概述:

ziplib(SharpZipLib,以前的NZipLib)是一个完全在C#为.NET平台编写的Zip,GZip,Tar和BZip2库。它实现为一个程序集(可安装在GAC中),因此可以轻松地集成到其他项目(任何.NET语言)中。 #ziplib的创建者这样说:“我已经将zip库移植到C#,因为我需要gzip / zip压缩,我不想使用libzip.dll或类似的东西我想要的所有在纯C#“。

SharpZipLib官网提供的下载操作:.NET 1.1,.NET 2.0(3.5,4.0),.NET CF 1.0,.NET CF 2.0的装配:下载237 KB,源代码和示例下载708 KB;源代码和示例下载708 KB;帮助文件下载1208 KB;

SharpZipLib是在GPL下发布,遵守开源协议。

二.SharpZipLib核心类和方法介绍:

以上简单的介绍了SharpZipLib组件的相关背景,现在具体看一下该组件的相关核心类和方法:

  

1.ZipOutputStream类PutNextEntry():

public void PutNextEntry(ZipEntry entry)
{
 bool hasCrc;
 if (entry == null)
 {
 throw new ArgumentNullException("entry");
 }
 if (this.entries == null)
 {
 throw new InvalidOperationException("ZipOutputStream was finished");
 }
 if (this.curEntry != null)
 {
 this.CloseEntry();
 }
 if (this.entries.Count == 0x7fffffff)
 {
 throw new ZipException("Too many entries for Zip file");
 }
 CompressionMethod compressionMethod = entry.CompressionMethod;
 int defaultCompressionLevel = this.defaultCompressionLevel;
 entry.Flags &= 0x800;
 this.patchEntryHeader = false;
 if (entry.Size == 0L)
 {
 entry.CompressedSize = entry.Size;
 entry.Crc = 0L;
 compressionMethod = CompressionMethod.Stored;
 hasCrc = true;
 }
 else
 {
 hasCrc = (entry.Size >= 0L) && entry.HasCrc;
 if (compressionMethod == CompressionMethod.Stored)
 {
 if (!hasCrc)
 {
 if (!base.CanPatchEntries)
 {
  compressionMethod = CompressionMethod.Deflated;
  defaultCompressionLevel = 0;
 }
 }
 else
 {
 entry.CompressedSize = entry.Size;
 hasCrc = entry.HasCrc;
 }
 }
 }
 if (!hasCrc)
 {
 if (!base.CanPatchEntries)
 {
 entry.Flags |= 8;
 }
 else
 {
 this.patchEntryHeader = true;
 }
 }
 if (base.Password != null)
 {
 entry.IsCrypted = true;
 if (entry.Crc < 0L)
 {
 entry.Flags |= 8;
 }
 }
 entry.Offset = this.offset;
 entry.CompressionMethod = compressionMethod;
 this.curMethod = compressionMethod;
 this.sizePatchPos = -1L;
 if ((this.useZip64_ == UseZip64.On) || ((entry.Size < 0L) && (this.useZip64_ == UseZip64.Dynamic)))
 {
 entry.ForceZip64();
 }
 this.WriteLeInt(0x4034b50);
 this.WriteLeShort(entry.Version);
 this.WriteLeShort(entry.Flags);
 this.WriteLeShort((byte) entry.CompressionMethodForHeader);
 this.WriteLeInt((int) entry.DosTime);
 if (hasCrc)
 {
 this.WriteLeInt((int) entry.Crc);
 if (entry.LocalHeaderRequiresZip64)
 {
 this.WriteLeInt(-1);
 this.WriteLeInt(-1);
 }
 else
 {
 this.WriteLeInt(entry.IsCrypted ? (((int) entry.CompressedSize) + 12) : ((int) entry.CompressedSize));
 this.WriteLeInt((int) entry.Size);
 }
 }
 else
 {
 if (this.patchEntryHeader)
 {
 this.crcPatchPos = base.baseOutputStream_.Position;
 }
 this.WriteLeInt(0);
 if (this.patchEntryHeader)
 {
 this.sizePatchPos = base.baseOutputStream_.Position;
 }
 if (entry.LocalHeaderRequiresZip64 || this.patchEntryHeader)
 {
 this.WriteLeInt(-1);
 this.WriteLeInt(-1);
 }
 else
 {
 this.WriteLeInt(0);
 this.WriteLeInt(0);
 }
 }
 byte[] buffer = ZipConstants.ConvertToArray(entry.Flags, entry.Name);
 if (buffer.Length > 0xffff)
 {
 throw new ZipException("Entry name too long.");
 }
 ZipExtraData extraData = new ZipExtraData(entry.ExtraData);
 if (entry.LocalHeaderRequiresZip64)
 {
 extraData.StartNewEntry();
 if (hasCrc)
 {
 extraData.AddLeLong(entry.Size);
 extraData.AddLeLong(entry.CompressedSize);
 }
 else
 {
 extraData.AddLeLong(-1L);
 extraData.AddLeLong(-1L);
 }
 extraData.AddNewEntry(1);
 if (!extraData.Find(1))
 {
 throw new ZipException("Internal error cant find extra data");
 }
 if (this.patchEntryHeader)
 {
 this.sizePatchPos = extraData.CurrentReadIndex;
 }
 }
 else
 {
 extraData.Delete(1);
 }
 if (entry.AESKeySize > 0)
 {
 AddExtraDataAES(entry, extraData);
 }
 byte[] entryData = extraData.GetEntryData();
 this.WriteLeShort(buffer.Length);
 this.WriteLeShort(entryData.Length);
 if (buffer.Length > 0)
 {
 base.baseOutputStream_.Write(buffer, 0, buffer.Length);
 }
 if (entry.LocalHeaderRequiresZip64 && this.patchEntryHeader)
 {
 this.sizePatchPos += base.baseOutputStream_.Position;
 }
 if (entryData.Length > 0)
 {
 base.baseOutputStream_.Write(entryData, 0, entryData.Length);
 }
 this.offset += (30 + buffer.Length) + entryData.Length;
 if (entry.AESKeySize > 0)
 {
 this.offset += entry.AESOverheadSize;
 }
 this.curEntry = entry;
 this.crc.Reset();
 if (compressionMethod == CompressionMethod.Deflated)
 {
 base.deflater_.Reset();
 base.deflater_.SetLevel(defaultCompressionLevel);
 }
 this.size = 0L;
 if (entry.IsCrypted)
 {
 if (entry.AESKeySize > 0)
 {
 this.WriteAESHeader(entry);
 }
 else if (entry.Crc < 0L)
 {
 this.WriteEncryptionHeader(entry.DosTime << 0x10);
 }
 else
 {
 this.WriteEncryptionHeader(entry.Crc);
 }
 }
}

2.ZipOutputStream类Finish():

public override void Finish()
{
 if (this.entries != null)
 {
 if (this.curEntry != null)
 {
 this.CloseEntry();
 }
 long count = this.entries.Count;
 long sizeEntries = 0L;
 foreach (ZipEntry entry in this.entries)
 {
 this.WriteLeInt(0x2014b50);
 this.WriteLeShort(0x33);
 this.WriteLeShort(entry.Version);
 this.WriteLeShort(entry.Flags);
 this.WriteLeShort((short) entry.CompressionMethodForHeader);
 this.WriteLeInt((int) entry.DosTime);
 this.WriteLeInt((int) entry.Crc);
 if (entry.IsZip64Forced() || (entry.CompressedSize >= 0xffffffffL))
 {
 this.WriteLeInt(-1);
 }
 else
 {
 this.WriteLeInt((int) entry.CompressedSize);
 }
 if (entry.IsZip64Forced() || (entry.Size >= 0xffffffffL))
 {
 this.WriteLeInt(-1);
 }
 else
 {
 this.WriteLeInt((int) entry.Size);
 }
 byte[] buffer = ZipConstants.ConvertToArray(entry.Flags, entry.Name);
 if (buffer.Length > 0xffff)
 {
 throw new ZipException("Name too long.");
 }
 ZipExtraData extraData = new ZipExtraData(entry.ExtraData);
 if (entry.CentralHeaderRequiresZip64)
 {
 extraData.StartNewEntry();
 if (entry.IsZip64Forced() || (entry.Size >= 0xffffffffL))
 {
  extraData.AddLeLong(entry.Size);
 }
 if (entry.IsZip64Forced() || (entry.CompressedSize >= 0xffffffffL))
 {
  extraData.AddLeLong(entry.CompressedSize);
 }
 if (entry.Offset >= 0xffffffffL)
 {
  extraData.AddLeLong(entry.Offset);
 }
 extraData.AddNewEntry(1);
 }
 else
 {
 extraData.Delete(1);
 }
 if (entry.AESKeySize > 0)
 {
 AddExtraDataAES(entry, extraData);
 }
 byte[] entryData = extraData.GetEntryData();
 byte[] buffer3 = (entry.Comment != null) ? ZipConstants.ConvertToArray(entry.Flags, entry.Comment) : new byte[0];
 if (buffer3.Length > 0xffff)
 {
 throw new ZipException("Comment too long.");
 }
 this.WriteLeShort(buffer.Length);
 this.WriteLeShort(entryData.Length);
 this.WriteLeShort(buffer3.Length);
 this.WriteLeShort(0);
 this.WriteLeShort(0);
 if (entry.ExternalFileAttributes != -1)
 {
 this.WriteLeInt(entry.ExternalFileAttributes);
 }
 else if (entry.IsDirectory)
 {
 this.WriteLeInt(0x10);
 }
 else
 {
 this.WriteLeInt(0);
 }
 if (entry.Offset >= 0xffffffffL)
 {
 this.WriteLeInt(-1);
 }
 else
 {
 this.WriteLeInt((int) entry.Offset);
 }
 if (buffer.Length > 0)
 {
 base.baseOutputStream_.Write(buffer, 0, buffer.Length);
 }
 if (entryData.Length > 0)
 {
 base.baseOutputStream_.Write(entryData, 0, entryData.Length);
 }
 if (buffer3.Length > 0)
 {
 base.baseOutputStream_.Write(buffer3, 0, buffer3.Length);
 }
 sizeEntries += ((0x2e + buffer.Length) + entryData.Length) + buffer3.Length;
 }
 using (ZipHelperStream stream = new ZipHelperStream(base.baseOutputStream_))
 {
 stream.WriteEndOfCentralDirectory(count, sizeEntries, this.offset, this.zipComment);
 }
 this.entries = null;
 }
}

 3.ZipEntry类Clone():

public object Clone()
{
 ZipEntry entry = (ZipEntry) base.MemberwiseClone();
 if (this.extra != null)
 {
 entry.extra = new byte[this.extra.Length];
 Array.Copy(this.extra, 0, entry.extra, 0, this.extra.Length);
 }
 return entry;
}

 4.ZipOutputStream类Write():

public override void Write(byte[] buffer, int offset, int count)
{
 if (this.curEntry == null)
 {
 throw new InvalidOperationException("No open entry.");
 }
 if (buffer == null)
 {
 throw new ArgumentNullException("buffer");
 }
 if (offset < 0)
 {
 throw new ArgumentOutOfRangeException("offset", "Cannot be negative");
 }
 if (count < 0)
 {
 throw new ArgumentOutOfRangeException("count", "Cannot be negative");
 }
 if ((buffer.Length - offset) < count)
 {
 throw new ArgumentException("Invalid offset/count combination");
 }
 this.crc.Update(buffer, offset, count);
 this.size += count;
 switch (this.curMethod)
 {
 case CompressionMethod.Stored:
 if (base.Password != null)
 {
 this.CopyAndEncrypt(buffer, offset, count);
 }
 else
 {
 base.baseOutputStream_.Write(buffer, offset, count);
 }
 break;

 case CompressionMethod.Deflated:
 base.Write(buffer, offset, count);
 break;
 }
}

三.SharpZipLib实例:

  1.压缩单个文件:

   

 /// <summary>
 /// 压缩单个文件
 /// </summary>
 /// <param name="fileToZip">要压缩的文件</param>
 /// <param name="zipedFile">压缩后的文件</param>
 /// <param name="compressionLevel">压缩等级</param>
 /// <param name="blockSize">每次写入大小</param>
 public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize)
 {
 if (string.IsNullOrEmpty(fileToZip))
 {
 throw new ArgumentNullException(fileToZip);
 }
 if (string.IsNullOrEmpty(zipedFile))
 {
 throw new ArgumentNullException(zipedFile);
 }
 if (!File.Exists(fileToZip))
 {
 throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");
 }
 try
 {
 using (var zipFile = File.Create(zipedFile))
 {
  using (var zipStream = new ZipOutputStream(zipFile))
  {
  using (var streamToZip = new FileStream(fileToZip, FileMode.Open, FileAccess.Read))
  {
  var fileName = fileToZip.Substring(fileToZip.LastIndexOf("\", StringComparison.Ordinal) + 1);
  var zipEntry = new ZipEntry(fileName);
  zipStream.PutNextEntry(zipEntry);
  zipStream.SetLevel(compressionLevel);
  var buffer = new byte[blockSize];
  try
  {
  int sizeRead;
  do
  {
   sizeRead = streamToZip.Read(buffer, 0, buffer.Length);
   zipStream.Write(buffer, 0, sizeRead);
  }
  while (sizeRead > 0);
  }
  catch (Exception ex)
  {
  throw new Exception(ex.Message);
  }
  streamToZip.Close();
  }
  zipStream.Finish();
  zipStream.Close();
  }
  zipFile.Close();
 }
 }
 catch (IOException ioex)
 {
 throw new IOException(ioex.Message);
 }
 catch (Exception ex)
 {
 throw new Exception(ex.Message);
 }

 }

 2. 压缩单个文件:

 /// <summary>
 /// 压缩单个文件
 /// </summary>
 /// <param name="fileToZip">要进行压缩的文件名</param>
 /// <param name="zipedFile">压缩后生成的压缩文件名</param>
 public static void ZipFile(string fileToZip, string zipedFile)
 {
 if (string.IsNullOrEmpty(fileToZip))
 {
 throw new ArgumentException(fileToZip);
 }
 if (string.IsNullOrEmpty(zipedFile))
 {
 throw new ArgumentException(zipedFile);
 }
 if (!File.Exists(fileToZip))
 {
 throw new FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");
 }
 try
 {
 using (var fs = File.OpenRead(fileToZip))
 {
  var buffer = new byte[fs.Length];
  fs.Read(buffer, 0, buffer.Length);
  fs.Close();
  using (var zipFile = File.Create(zipedFile))
  {
  using (var zipStream = new ZipOutputStream(zipFile))
  {
  var fileName = fileToZip.Substring(fileToZip.LastIndexOf("\", StringComparison.Ordinal) + 1);
  var zipEntry = new ZipEntry(fileName);
  zipStream.PutNextEntry(zipEntry);
  zipStream.SetLevel(5);
  zipStream.Write(buffer, 0, buffer.Length);
  zipStream.Finish();
  zipStream.Close();
  }
  }
 }
 }
 catch (IOException ioex)
 {
 throw new IOException(ioex.Message);
 }
 catch (Exception ex)
 {
 throw new Exception(ex.Message);
 }

 }

3.压缩多层目录:

 /// <summary>
 /// 压缩多层目录
 /// </summary>
 /// <param name="strDirectory">目录</param>
 /// <param name="zipedFile">压缩文件</param>
 public static void ZipFileDirectory(string strDirectory, string zipedFile)
 {
 if (string.IsNullOrEmpty(strDirectory))
 {
 throw new ArgumentException(strDirectory);
 }
 if (string.IsNullOrEmpty(zipedFile))
 {
 throw new ArgumentException(zipedFile);
 }
 using (var zipFile = File.Create(zipedFile))
 {
 using (var s = new ZipOutputStream(zipFile))
 {
  ZipSetp(strDirectory, s, "");
 }
 }
 }

4.递归遍历目录:

 /// <summary>
 /// 递归遍历目录
 /// </summary>
 /// <param name="strDirectory">目录</param>
 /// <param name="s">ZipOutputStream对象</param>
 /// <param name="parentPath">父路径</param>
 private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath)
 {
 if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar)
 {
 strDirectory += Path.DirectorySeparatorChar;
 }
 var crc = new Crc32();

 var filenames = Directory.GetFileSystemEntries(strDirectory);
 try
 {
 // 遍历所有的文件和目录
 foreach (var file in filenames)
 {
  // 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
  if (Directory.Exists(file))
  {
  var pPath = parentPath;
  pPath += file.Substring(file.LastIndexOf("\", StringComparison.Ordinal) + 1);
  pPath += "\";
  ZipSetp(file, s, pPath);
  }
  // 否则直接压缩文件
  else
  {
  //打开压缩文件
  using (var fs = File.OpenRead(file))
  {
  var buffer = new byte[fs.Length];
  fs.Read(buffer, 0, buffer.Length);
  var fileName = parentPath + file.Substring(file.LastIndexOf("\", StringComparison.Ordinal) + 1);
  var entry = new ZipEntry(fileName)
  {
  DateTime = DateTime.Now,
  Size = fs.Length
  };
  fs.Close();
  crc.Reset();
  crc.Update(buffer);
  entry.Crc = crc.Value;
  s.PutNextEntry(entry);
  s.Write(buffer, 0, buffer.Length);
  }
  }
 }
 }
 catch (IOException ioex)
 {
 throw new IOException(ioex.Message);
 }
 catch (Exception ex)
 {
 throw new Exception(ex.Message);
 }

 }

5.解压缩一个 zip 文件: 

 /// <summary>
 /// 解压缩一个 zip 文件。
 /// </summary>
 /// <param name="zipedFile">The ziped file.</param>
 /// <param name="strDirectory">The STR directory.</param>
 /// <param name="password">zip 文件的密码。</param>
 /// <param name="overWrite">是否覆盖已存在的文件。</param>
 public void UnZip(string zipedFile, string strDirectory, string password, bool overWrite)
 {
 if (string.IsNullOrEmpty(zipedFile))
 {
 throw new ArgumentException(zipedFile);
 }
 if (string.IsNullOrEmpty(strDirectory))
 {
 throw new ArgumentException(strDirectory);
 }
 if (string.IsNullOrEmpty(password))
 {
 throw new ArgumentException(password);
 }
 if (strDirectory == "")
 {
 strDirectory = Directory.GetCurrentDirectory();
 }
 if (!strDirectory.EndsWith("\"))
 {
 strDirectory = strDirectory + "\";
 }
 try
 {
 using (var s = new ZipInputStream(File.OpenRead(zipedFile)))
 {
  s.Password = password;
  ZipEntry theEntry;
  while ((theEntry = s.GetNextEntry()) != null)
  {
  var directoryName = string.Empty;
  var pathToZip = theEntry.Name;
  if (pathToZip != "")
  {
  directoryName = Path.GetDirectoryName(pathToZip) + "\";
  }
  var fileName = Path.GetFileName(pathToZip);
  Directory.CreateDirectory(strDirectory + directoryName);
  if (fileName == "") continue;
  if ((!File.Exists(strDirectory + directoryName + fileName) || !overWrite) &&
  (File.Exists(strDirectory + directoryName + fileName))) continue;
  using (var streamWriter = File.Create(strDirectory + directoryName + fileName))
  {
  var data = new byte[2048];
  while (true)
  {
  var size = s.Read(data, 0, data.Length);

  if (size > 0)
   streamWriter.Write(data, 0, size);
  else
   break;
  }
  streamWriter.Close();
  }
  }

  s.Close();
 }
 }
 catch (IOException ioex)
 {
 throw new IOException(ioex.Message);
 }
 catch (Exception ex)
 {
 throw new Exception(ex.Message);
 }

 }

四.总结:

以上是对SharpZipLib组件的相关介绍,本文的讲解上比较的浅显,如果需要深入的学习可以进入官网进行详细的学习。组件的功能是很强大的,如何在项目中使用组件,完成我们在项目中需要实现的功能,这就是对每个开发者提出了要求,需要我们仔细的去考虑。

任何学习都需要我们自己去探索和思考,对于一个开发者来说,最重要的就是思考,因为在我们的职业生涯中,没有什么的重要性能够超过思考。如果有不足之处还望各位读者包含,并留言指正。

热心网友 时间:2022-05-19 11:57

面是对#ZipLib进行.net下的解压缩的方法的介绍。

1.BZip2
加入ICSharpCode.SharpZipLib.dll的引用,在#Develop的安装目录下的\SharpDevelop\bin目录下。然后在程序中使用using语句把BZip2

类库包含进来。
压缩:使用BZip2的静态方法Compress。
它的第一个参数是所要压缩的文件所代表的输入流,可以使用System.IO.File的静态方法OpenRead。
第二个参数是要建立的压缩文件所代表的输出流,可以使用System.IO.File的静态方法Create创建,压缩文件名是所要压缩文件的文件名

加上压缩后缀.bz(同样你也可以取其他的文件名)。
第三个参数是要压缩的块大小(一般为2048的整数)。

解压:使用BZip2的静态方法Decompress。
它的第一个参数是所要解压的压缩文件所代表的输入流,可以使用System.IO.File的静态方法OpenRead。
第二个参数是要建立的解压文件所代表的输出流,可以使用System.IO.File的静态方法Create创建,因为解压文件的文件名是去掉了压缩
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
女生多大后可以不在长身高? 如何不用软件把手机投屏到电脑上手机屏幕怎样投放到电脑上 战时拒绝、故意延误军事订货罪既遂的处罚? 战时故意延误军事订货罪处罚标准 名师1+1导读方案:汤姆·索亚历险记目录 三星sm-g7200打开微信慢,无法正常收看,网速不慢。 笔记本电脑如何调亮屏幕亮度 大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 电脑丢失icsharpcode.sharpziplib.dll怎么办 icsharpcode.sharpziplib.dll放在哪 狗能吃什么水果 除了苹果之外,狗狗还可以吃什么水果? 狗能吃的水果是什么 狗狗吃什么水果最好? 华为nova耗电到底怎么办?玩QQ耗电快 看百度也耗电快。。到底怎么办才好? 蚂蚁是怎样活动的- 问一问 蚂蚁是一种怎样的小动物 怎样的蚂蚁? 什么的蚂蚁。 ( )的蚂蚁??(形容词) 20万的三责险多少钱 双卡停用一个卡会怎么样? 手机卡暂停使用怎么办? 手机卡已经停机超过三个月被暂时停用了,不去管他会不会有事 如果手机号被暂时停用对什么会有影响? 移动手机卡不用了不注销会怎么样 手机号停用不注销会怎么样 三星46寸液晶拼接屏怎么调信号源 在C#里调用icsharpcode.sharpziplib解压缩文件的问题? C# 采用ICSharpCode.SharpZipLib解压缩,文件全部解到一个文件夹里了 c# 通过ICSharpCode.SharpZipLib.dll 这个工具可以生成32位的压缩文件吗?求高手帮忙 C#如何使用ICSharpCode.SharpZipLib加密压缩文件 91助手安装程序失败 现在不能卸载也不能安装了 错误信息 ICSharpCode.SharpZipLib.Zip.ZipException: Wron ICSharpCode.SharpZipLib.DLL能进行屏幕图像压缩与解压缩吗?有C#的具体代码实现屏幕图像的压缩与解压缩! 如何调用icsharpcode.sharpziplib.dll类 C# 使用 ICSharpCode.SharpZipLib 不能解压LINUX系统压缩的文件,怎么办? C#中用ICSharpCode.SharpZipLib.dll解压缩ZIP文件,如何可以获取要解压... icsharpcode.sharpziplib.dll有没有4.0的 sharpziplib压缩文件怎么用c++解压 itextsharp.dll和ICSharpCode.SharpZipLib.dll从哪里获得? 急求:Could not load file or assembly &#39;ICSharpCode.SharpZipLib C# 如何在 C#中用 SharpZipLib 进行 ZIP 压缩与解压 c#压缩解压 文件夹 关于C#压缩文件夹下所有文件问题 C#里怎么添加压缩包 看着爱远去,我像傻瓜一样是什么日语歌曲? 哒咩哒咩哒咩哟是什么歌? 日语(好听但不知名的日文歌)