利用SharpZipLib进行压缩和解压缩

因为工作需要所以要用C#写一个压缩解压缩的程序,从网上搜索大概有那么三种方式,1、调用winrar的接口函数来实现,缺点是必须安装winrar所以不具有通用性。2、msdn说的(使用 J# 类库中的 Zip 类压缩文件和数据)3、就是利用SharpZipLib进行压缩和解压缩这个是一家公司开发的可以用于封装在商业用途的软件中的.net类。下载地址 http://www.icsharpcode.net/ 从壓縮包里面将ICSharpCode.SharpZipLib.dll文件引入.net程序即可使用。在写这个类的时候参考了csdn一个网友写的类,他的类只能压缩活页夹下面的文件,而不能压缩子目录及其子目录下面的文件,解压的时候只能解压没有子目录的压缩包。所以我将它作了改进,使之能够压缩子目录及其文件和能够解压带有子目录及其文件的压缩包。下面是程序代码及其注释。


ExpandedBlockStart.gif ContractedBlock.gif /**/ /// 以下为ZipClass即是压缩类
None.gif using  System;
None.gif
using  System.IO;
None.gif
None.gif
using  ICSharpCode.SharpZipLib.Checksums;
None.gif
using  ICSharpCode.SharpZipLib.Zip;
None.gif
using  ICSharpCode.SharpZipLib.GZip;
None.gif
None.gif
namespace  Webpos
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public class ZipClass
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public string cutStr = "";
InBlock.gif
ContractedSubBlock.gifExpandedSubBlockStart.gif        
这个函数我没有去研究他#region 这个函数我没有去研究他
InBlock.gif        
public void ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//如果文件没有找到则报错。
InBlock.gif
            if (! System.IO.File.Exists(FileToZip)) 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
ExpandedSubBlockEnd.gif            }

InBlock.gif  
InBlock.gif            System.IO.FileStream StreamToZip 
= new System.IO.FileStream(FileToZip,System.IO.FileMode.Open , System.IO.FileAccess.Read);
InBlock.gif            System.IO.FileStream ZipFile 
= System.IO.File.Create(ZipedFile);
InBlock.gif            ZipOutputStream ZipStream 
= new ZipOutputStream(ZipFile);
InBlock.gif            ZipEntry ZipEntry 
= new ZipEntry("ZippedFile");
InBlock.gif            ZipStream.PutNextEntry(ZipEntry);
InBlock.gif            ZipStream.SetLevel(CompressionLevel);
InBlock.gif            
byte[] buffer = new byte[BlockSize];
InBlock.gif            System.Int32 size 
=StreamToZip.Read(buffer,0,buffer.Length);
InBlock.gif            ZipStream.Write(buffer,
0,size);
InBlock.gif            
try 
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
while (size < StreamToZip.Length) 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
int sizeRead =StreamToZip.Read(buffer,0,buffer.Length);
InBlock.gif                    ZipStream.Write(buffer,
0,sizeRead);
InBlock.gif                    size 
+= sizeRead;
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }
 
InBlock.gif            
catch(System.Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
throw ex;
ExpandedSubBlockEnd.gif            }

InBlock.gif            ZipStream.Finish();
InBlock.gif            ZipStream.Close();
InBlock.gif            StreamToZip.Close();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif        
#endregion

InBlock.gif
InBlock.gif        
//Get all DirectoryInfo
InBlock.gif
        private void direct(DirectoryInfo di,ref ZipOutputStream s,Crc32 crc)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//DirectoryInfo di = new DirectoryInfo(filenames);
InBlock.gif
            DirectoryInfo[] dirs = di.GetDirectories("*");
InBlock.gif
InBlock.gif            
//遍历目录下面的所有的子目录
InBlock.gif
            foreach(DirectoryInfo dirNext in dirs)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
//将该目录下的所有文件添加到 ZipOutputStream s 压缩流里面
InBlock.gif
                FileInfo[] a  = dirNext.GetFiles();
InBlock.gif                
this.writeStream( ref s,a,crc );
InBlock.gif
InBlock.gif                
//递归调用直到把所有的目录遍历完成
InBlock.gif
                direct(dirNext,ref s,crc);
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
InBlock.gif        
private void writeStream(ref ZipOutputStream s,FileInfo[] a,Crc32 crc)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
foreach ( FileInfo fi in a )
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
//string fifn = fi.FullName;
InBlock.gif
                FileStream fs = fi.OpenRead();
InBlock.gif
InBlock.gif                
byte[] buffer = new byte[fs.Length];
InBlock.gif                fs.Read(buffer, 
0, buffer.Length);
InBlock.gif
InBlock.gif
InBlock.gif                
//ZipEntry entry = new ZipEntry(file);   Path.GetFileName(file)
InBlock.gif
                string file = fi.FullName;
InBlock.gif                file 
= file.Replace(cutStr,"");
InBlock.gif
InBlock.gif                ZipEntry entry 
= new ZipEntry(file);
InBlock.gif
InBlock.gif                entry.DateTime 
= DateTime.Now;
InBlock.gif   
InBlock.gif                
// set Size and the crc, because the information
InBlock.gif                
// about the size and crc should be stored in the header
InBlock.gif                
// if it is not set it is automatically written in the footer.
InBlock.gif                
// (in this case size == crc == -1 in the header)
InBlock.gif                
// Some ZIP programs have problems with zip files that don't store
InBlock.gif                
// the size and crc in the header.
InBlock.gif
                entry.Size = fs.Length;
InBlock.gif                fs.Close();
InBlock.gif
InBlock.gif                crc.Reset();
InBlock.gif                crc.Update(buffer);
InBlock.gif   
InBlock.gif                entry.Crc  
= crc.Value;
InBlock.gif   
InBlock.gif                s.PutNextEntry(entry);
InBlock.gif   
InBlock.gif                s.Write(buffer, 
0, buffer.Length);    
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif        }

InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        
/**//// <summary>
InBlock.gif        
/// 主调函数
InBlock.gif        
/// </summary>
InBlock.gif        
/// <param name="args">args[0]为你要压缩的目录所在的路径 
InBlock.gif        
/// 例如:D:\\temp\\  (注意temp 后面加 \\ 但是你写程序的时候怎么修改都可以)
InBlock.gif        
/// args[1]为压缩后的文件名及其路径
InBlock.gif        
/// 例如:D:\\temp.zip
ExpandedSubBlockEnd.gif        
/// </param>

InBlock.gif        public void ZipFileMain(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
//string filenames = Directory.GetFiles(args[0]);
InBlock.gif
  
InBlock.gif            Crc32 crc 
= new Crc32();
InBlock.gif            ZipOutputStream s 
= new ZipOutputStream(File.Create(args[1]));
InBlock.gif  
InBlock.gif            s.SetLevel(
6); // 0 - store only to 9 - means best compression
InBlock.gif

InBlock.gif            DirectoryInfo di 
= new DirectoryInfo(args[0]);
InBlock.gif
InBlock.gif            FileInfo[] a 
= di.GetFiles();
InBlock.gif
InBlock.gif            cutStr 
= args[0].Trim();
InBlock.gif            
//压缩这个目录下的所有文件
InBlock.gif
            writeStream(ref s,a,crc);
InBlock.gif            
//压缩这个目录下子目录及其文件
InBlock.gif
            direct(di,ref s,crc);
InBlock.gif
InBlock.gif            s.Finish();
InBlock.gif            s.Close();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
ExpandedBlockStart.gifContractedBlock.gif
/**/ ///下面是解压缩文件的类
None.gif using  System;
None.gif
using  System.Text;
None.gif
using  System.Collections;
None.gif
using  System.IO;
None.gif
using  System.Diagnostics;
None.gif
using  System.Runtime.Serialization.Formatters.Binary;
None.gif
using  System.Data;
None.gif
None.gif
using  ICSharpCode.SharpZipLib.BZip2;
None.gif
using  ICSharpCode.SharpZipLib.Zip;
None.gif
using  ICSharpCode.SharpZipLib.Zip.Compression;
None.gif
using  ICSharpCode.SharpZipLib.Zip.Compression.Streams;
None.gif
using  ICSharpCode.SharpZipLib.GZip;
None.gif
None.gif
namespace  Webpos
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
public class UnZipClass
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
public void UnZip(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            ZipInputStream s 
= new ZipInputStream(File.OpenRead(args[0]));
InBlock.gif  
InBlock.gif            ZipEntry theEntry;
InBlock.gif            
while ((theEntry = s.GetNextEntry()) != null
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
string directoryName = Path.GetDirectoryName(args[1]);
InBlock.gif                
string fileName      = Path.GetFileName(theEntry.Name);
InBlock.gif   
InBlock.gif                
//生成解压目录
InBlock.gif
                Directory.CreateDirectory(directoryName);
InBlock.gif   
InBlock.gif                
if (fileName != String.Empty) 
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif
InBlock.gif                                              
//如果文件的壓縮後的大小為0那麼說明這個文件是空的因此不需要進行讀出寫入
InBlock.gif
                                              if( theEntry.CompressedSize == 0 )
InBlock.gif                         
break;
InBlock.gif                    
//解压文件到指定的目录
InBlock.gif
                    directoryName = Path.GetDirectoryName(args[1]+theEntry.Name);
InBlock.gif                    
//建立下面的目录和子目录
InBlock.gif
                    Directory.CreateDirectory(directoryName);
InBlock.gif
InBlock.gif                    FileStream streamWriter 
= File.Create(args[1]+theEntry.Name);
InBlock.gif    
InBlock.gif                    
int size = 2048;
InBlock.gif                    
byte[] data = new byte[2048];
InBlock.gif                    
while (true
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        size 
= s.Read(data, 0, data.Length);
InBlock.gif                        
if (size > 0
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
dot.gif{
InBlock.gif                            streamWriter.Write(data, 
0, size);
ExpandedSubBlockEnd.gif                        }
 
InBlock.gif                        
else 
ExpandedSubBlockStart.gifContractedSubBlock.gif                        
dot.gif{
InBlock.gif                            
break;
ExpandedSubBlockEnd.gif                        }

ExpandedSubBlockEnd.gif                    }

InBlock.gif                    streamWriter.Close();
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            s.Close();
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
希望各个网友将程序修改的更好欢迎和我讨论msn: hunter_32252@hotmail.com
E-Mail: hunter_32@163.com
等以后找时间将msdn上面的  使用 J# 类库中的 Zip 类压缩文件和数据 整理出来和广大朋友们分享。

转载于:https://www.cnblogs.com/hunter-32/archive/2007/03/04/663646.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值