好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C# 使用SharpZipLib生成压缩包的实例代码

本文通过一个简单的小例子简述sharpziplib压缩文件的常规用法,仅供学习分享使用,如有不足之处,还请指正。

什么是sharpziplib ?

sharpziplib是一个c#的类库,主要用来解压缩zip,gzip,bzip2,tar等格式,是以托管程序集的方式实现,可以方便的应用于其他的项目之中。

在工程中引用sharpziplib

在项目中,点击项目名称右键-->管理nuget程序包,打开nuget包管理器窗口,进行搜索下载即可,如下图所示:

sharpziplib的关键类结构图

如下所示:

涉及知识点:

•zipoutputstream 压缩输出流,将文件一个接一个的写入压缩文档,此类不是线程安全的。
•putnextentry 开始一个新的zip条目,zipoutputstream中的方法。
•zipentry 一个zip文件中的条目,可以理解为 压缩包 里面的一个文件夹/文件。
•zipinputstream 解压缩输出流,从压缩包中一个接一个的读出文档。
•getnextentry 读出zip条目,zipinputstream中的方法。

示例效果图:

关于解压缩小例子的示例效果图,如下:

核心代码

?

using icsharpcode.sharpziplib.checksum;

using icsharpcode.sharpziplib.zip;

using system;

using system.collections.generic;

using system.io;

using system.linq;

using system.text;

using system.threading.tasks;

namespace demozip

{

   class ziphelper

   {

     private string rootpath = string .empty;

     #region 压缩

     /// <summary> 

     /// 递归压缩文件夹的内部方法 

     /// </summary> 

     /// <param name="foldertozip">要压缩的文件夹路径</param> 

     /// <param name="zipstream">压缩输出流</param> 

     /// <param name="parentfoldername">此文件夹的上级文件夹</param> 

     /// <returns></returns> 

     private bool zipdirectory( string foldertozip, zipoutputstream zipstream, string parentfoldername)

     {

       bool result = true ;

       string [] folders, files;

       zipentry ent = null ;

       filestream fs = null ;

       crc32 crc = new crc32();

       try

       {

         string entname = foldertozip.replace( this .rootpath, string .empty)+ "/" ;

         //path测试数据bine(parentfoldername, path.getfilename(foldertozip) + "/")

         ent = new zipentry(entname);

         zipstream.putnextentry(ent);

         zipstream.flush();

         files = directory.getfiles(foldertozip);

         foreach ( string file in files)

         {

           fs = file.openread(file);

           byte [] buffer = new byte [fs.length];

           fs.read(buffer, 0, buffer.length);

           ent = new zipentry(entname + path.getfilename(file));

           ent.datetime = datetime.now;

           ent.size = fs.length;

           fs.close();

           crc.reset();

           crc.update(buffer);

           ent.crc = crc.value;

           zipstream.putnextentry(ent);

           zipstream.write(buffer, 0, buffer.length);

         }

       }

       catch

       {

         result = false ;

       }

       finally

       {

         if (fs != null )

         {

           fs.close();

           fs.dispose();

         }

         if (ent != null )

         {

           ent = null ;

         }

         gc.collect();

         gc.collect(1);

       }

       folders = directory.getdirectories(foldertozip);

       foreach ( string folder in folders)

         if (!zipdirectory(folder, zipstream, foldertozip))

           return false ;

       return result;

     }

     /// <summary> 

     /// 压缩文件夹 

     /// </summary> 

     /// <param name="foldertozip">要压缩的文件夹路径</param> 

     /// <param name="zipedfile">压缩文件完整路径</param> 

     /// <param name="password">密码</param> 

     /// <returns>是否压缩成功</returns> 

     public bool zipdirectory( string foldertozip, string zipedfile, string password)

     {

       bool result = false ;

       if (!directory.exists(foldertozip))

         return result;

       zipoutputstream zipstream = new zipoutputstream(file.create(zipedfile));

       zipstream.setlevel(6);

       if (! string .isnullorempty(password)) zipstream.password = password;

       result = zipdirectory(foldertozip, zipstream, "" );

       zipstream.finish();

       zipstream.close();

       return result;

     }

     /// <summary> 

     /// 压缩文件夹 

     /// </summary> 

     /// <param name="foldertozip">要压缩的文件夹路径</param> 

     /// <param name="zipedfile">压缩文件完整路径</param> 

     /// <returns>是否压缩成功</returns> 

     public bool zipdirectory( string foldertozip, string zipedfile)

     {

       bool result = zipdirectory(foldertozip, zipedfile, null );

       return result;

     }

     /// <summary> 

     /// 压缩文件 

     /// </summary> 

     /// <param name="filetozip">要压缩的文件全名</param> 

     /// <param name="zipedfile">压缩后的文件名</param> 

     /// <param name="password">密码</param> 

     /// <returns>压缩结果</returns> 

     public bool zipfile( string filetozip, string zipedfile, string password)

     {

       bool result = true ;

       zipoutputstream zipstream = null ;

       filestream fs = null ;

       zipentry ent = null ;

       if (!file.exists(filetozip))

         return false ;

       try

       {

         fs = file.openread(filetozip);

         byte [] buffer = new byte [fs.length];

         fs.read(buffer, 0, buffer.length);

         fs.close();

         fs = file.create(zipedfile);

         zipstream = new zipoutputstream(fs);

         if (! string .isnullorempty(password)) zipstream.password = password;

         ent = new zipentry(path.getfilename(filetozip));

         zipstream.putnextentry(ent);

         zipstream.setlevel(6);

         zipstream.write(buffer, 0, buffer.length);

       }

       catch

       {

         result = false ;

       }

       finally

       {

         if (zipstream != null )

         {

           zipstream.finish();

           zipstream.close();

         }

         if (ent != null )

         {

           ent = null ;

         }

         if (fs != null )

         {

           fs.close();

           fs.dispose();

         }

       }

       gc.collect();

       gc.collect(1);

       return result;

     }

     /// <summary> 

     /// 压缩文件 

     /// </summary> 

     /// <param name="filetozip">要压缩的文件全名</param> 

     /// <param name="zipedfile">压缩后的文件名</param> 

     /// <returns>压缩结果</returns> 

     public bool zipfile( string filetozip, string zipedfile)

     {

       bool result = zipfile(filetozip, zipedfile, null );

       return result;

     }

     /// <summary> 

     /// 压缩文件或文件夹 

     /// </summary> 

     /// <param name="filetozip">要压缩的路径</param> 

     /// <param name="zipedfile">压缩后的文件名</param> 

     /// <param name="password">密码</param> 

     /// <returns>压缩结果</returns> 

     public bool zip( string filetozip, string zipedfile, string password)

     {

       bool result = false ;

       if (directory.exists(filetozip))

       {

         this .rootpath = path.getdirectoryname(filetozip);

         result = zipdirectory(filetozip, zipedfile, password);

       }

       else if (file.exists(filetozip))

       {

         this .rootpath = path.getdirectoryname(filetozip);

         result = zipfile(filetozip, zipedfile, password);

       }

       return result;

     }

     /// <summary> 

     /// 压缩文件或文件夹 

     /// </summary> 

     /// <param name="filetozip">要压缩的路径</param> 

     /// <param name="zipedfile">压缩后的文件名</param> 

     /// <returns>压缩结果</returns> 

     public bool zip( string filetozip, string zipedfile)

     {

       bool result = zip(filetozip, zipedfile, null );

       return result;

     }

     #endregion

     #region 解压

     /// <summary> 

     /// 解压功能(解压压缩文件到指定目录) 

     /// </summary> 

     /// <param name="filetounzip">待解压的文件</param> 

     /// <param name="zipedfolder">指定解压目标目录</param> 

     /// <param name="password">密码</param> 

     /// <returns>解压结果</returns> 

     public bool unzip( string filetounzip, string zipedfolder, string password)

     {

       bool result = true ;

       filestream fs = null ;

       zipinputstream zipstream = null ;

       zipentry ent = null ;

       string filename;

       if (!file.exists(filetounzip))

         return false ;

       if (!directory.exists(zipedfolder))

         directory.createdirectory(zipedfolder);

       try

       {

         zipstream = new zipinputstream(file.openread(filetounzip));

         if (! string .isnullorempty(password)) zipstream.password = password;

         while ((ent = zipstream.getnextentry()) != null )

         {

           if (! string .isnullorempty(ent.name))

           {

             filename = path测试数据bine(zipedfolder, ent.name);

             filename = filename.replace( '/' , '\\' ); //change by mr.hopegi 

             if (filename.endswith( "\\" ))

             {

               directory.createdirectory(filename);

               continue ;

             }

             fs = file.create(filename);

             int size = 2048;

             byte [] data = new byte [size];

             while ( true )

             {

               size = zipstream.read(data, 0, data.length);

               if (size > 0)

                 fs.write(data, 0, data.length);

               else

                 break ;

             }

           }

         }

       }

       catch

       {

         result = false ;

       }

       finally

       {

         if (fs != null )

         {

           fs.close();

           fs.dispose();

         }

         if (zipstream != null )

         {

           zipstream.close();

           zipstream.dispose();

         }

         if (ent != null )

         {

           ent = null ;

         }

         gc.collect();

         gc.collect(1);

       }

       return result;

     }

     /// <summary> 

     /// 解压功能(解压压缩文件到指定目录) 

     /// </summary> 

     /// <param name="filetounzip">待解压的文件</param> 

     /// <param name="zipedfolder">指定解压目标目录</param> 

     /// <returns>解压结果</returns> 

     public bool unzip( string filetounzip, string zipedfolder)

     {

       bool result = unzip(filetounzip, zipedfolder, null );

       return result;

     }

     #endregion

   }

}

备注

关于生成压缩的方法还有很多,如通过命令行调用winrar的执行文件,sharpziplib只是方法之一。

关于sharpziplib的的api文档,可参看 链接 。

总结

以上所述是小编给大家介绍的c# 使用sharpziplib生成压缩包的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://HdhCmsTestcnblogs测试数据/hsiang/archive/2018/09/28/9721423.html

dy("nrwz");

查看更多关于C# 使用SharpZipLib生成压缩包的实例代码的详细内容...

  阅读:46次