zoukankan      html  css  js  c++  java
  • C#

    前言

    本篇主要记录:VS2019 WinFrm桌面应用程序调用SharpZipLib,实现文件的简单压缩和解压缩功能。

    SharpZipLib 开源地址戳这里

    准备工作

    搭建WinFrm前台界面

    添加必要的控件,这里主要应用到GroupBox、Label、TextBox、CheckBox和Button,如下图

    核心代码

    构造ZipHelper类

    代码如下:

      1 using ICSharpCode.SharpZipLib.Checksum;
      2 using ICSharpCode.SharpZipLib.Zip;
      3 using System;
      4 using System.Collections.Generic;
      5 using System.IO;
      6 using System.Linq;
      7 using System.Text;
      8 using System.Threading.Tasks;
      9 
     10 namespace ZipUnzip
     11 {
     12     class ZipHelper
     13     {
     14         private string rootPath = string.Empty;
     15 
     16         #region 压缩  
     17 
     18         /// <summary>   
     19         /// 递归压缩文件夹的内部方法   
     20         /// </summary>   
     21         /// <param name="folderToZip">要压缩的文件夹路径</param>   
     22         /// <param name="zipStream">压缩输出流</param>   
     23         /// <param name="parentFolderName">此文件夹的上级文件夹</param>   
     24         /// <returns></returns>   
     25         private bool ZipDirectory(string folderToZip, ZipOutputStream zipStream, string parentFolderName)
     26         {
     27             bool result = true;
     28             string[] folders, files;
     29             ZipEntry ent = null;
     30             FileStream fs = null;
     31             Crc32 crc = new Crc32();
     32 
     33             try
     34             {
     35                 string entName = folderToZip.Replace(this.rootPath, string.Empty) + "/";
     36                 //Path.Combine(parentFolderName, Path.GetFileName(folderToZip) + "/")
     37                 ent = new ZipEntry(entName);
     38                 zipStream.PutNextEntry(ent);
     39                 zipStream.Flush();
     40 
     41                 files = Directory.GetFiles(folderToZip);
     42                 foreach (string file in files)
     43                 {
     44                     fs = File.OpenRead(file);
     45 
     46                     byte[] buffer = new byte[fs.Length];
     47                     fs.Read(buffer, 0, buffer.Length);
     48                     ent = new ZipEntry(entName + Path.GetFileName(file));
     49                     ent.DateTime = DateTime.Now;
     50                     ent.Size = fs.Length;
     51 
     52                     fs.Close();
     53 
     54                     crc.Reset();
     55                     crc.Update(buffer);
     56 
     57                     ent.Crc = crc.Value;
     58                     zipStream.PutNextEntry(ent);
     59                     zipStream.Write(buffer, 0, buffer.Length);
     60                 }
     61 
     62             }
     63             catch
     64             {
     65                 result = false;
     66             }
     67             finally
     68             {
     69                 if (fs != null)
     70                 {
     71                     fs.Close();
     72                     fs.Dispose();
     73                 }
     74                 if (ent != null)
     75                 {
     76                     ent = null;
     77                 }
     78                 GC.Collect();
     79                 GC.Collect(1);
     80             }
     81 
     82             folders = Directory.GetDirectories(folderToZip);
     83             foreach (string folder in folders)
     84                 if (!ZipDirectory(folder, zipStream, folderToZip))
     85                     return false;
     86 
     87             return result;
     88         }
     89 
     90         /// <summary>   
     91         /// 压缩文件夹    
     92         /// </summary>   
     93         /// <param name="folderToZip">要压缩的文件夹路径</param>   
     94         /// <param name="zipedFile">压缩文件完整路径</param>   
     95         /// <param name="password">密码</param>   
     96         /// <returns>是否压缩成功</returns>   
     97         public bool ZipDirectory(string folderToZip, string zipedFile, string password)
     98         {
     99             bool result = false;
    100             if (!Directory.Exists(folderToZip))
    101                 return result;
    102 
    103             ZipOutputStream zipStream = new ZipOutputStream(File.Create(zipedFile));
    104             zipStream.SetLevel(6);
    105             if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
    106 
    107             result = ZipDirectory(folderToZip, zipStream, "");
    108 
    109             zipStream.Finish();
    110             zipStream.Close();
    111 
    112             return result;
    113         }
    114 
    115         /// <summary>   
    116         /// 压缩文件夹   
    117         /// </summary>   
    118         /// <param name="folderToZip">要压缩的文件夹路径</param>   
    119         /// <param name="zipedFile">压缩文件完整路径</param>   
    120         /// <returns>是否压缩成功</returns>   
    121         public bool ZipDirectory(string folderToZip, string zipedFile)
    122         {
    123             bool result = ZipDirectory(folderToZip, zipedFile, null);
    124             return result;
    125         }
    126 
    127         /// <summary>   
    128         /// 压缩文件   
    129         /// </summary>   
    130         /// <param name="fileToZip">要压缩的文件全名</param>   
    131         /// <param name="zipedFile">压缩后的文件名</param>   
    132         /// <param name="password">密码</param>   
    133         /// <returns>压缩结果</returns>   
    134         public bool ZipFile(string fileToZip, string zipedFile, string password)
    135         {
    136             bool result = true;
    137             ZipOutputStream zipStream = null;
    138             FileStream fs = null;
    139             ZipEntry ent = null;
    140 
    141             if (!File.Exists(fileToZip))
    142                 return false;
    143 
    144             try
    145             {
    146                 fs = File.OpenRead(fileToZip);
    147                 byte[] buffer = new byte[fs.Length];
    148                 fs.Read(buffer, 0, buffer.Length);
    149                 fs.Close();
    150 
    151                 fs = File.Create(zipedFile);
    152                 zipStream = new ZipOutputStream(fs);
    153                 if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
    154                 ent = new ZipEntry(Path.GetFileName(fileToZip));
    155                 zipStream.PutNextEntry(ent);
    156                 zipStream.SetLevel(6);
    157 
    158                 zipStream.Write(buffer, 0, buffer.Length);
    159 
    160             }
    161             catch
    162             {
    163                 result = false;
    164             }
    165             finally
    166             {
    167                 if (zipStream != null)
    168                 {
    169                     zipStream.Finish();
    170                     zipStream.Close();
    171                 }
    172                 if (ent != null)
    173                 {
    174                     ent = null;
    175                 }
    176                 if (fs != null)
    177                 {
    178                     fs.Close();
    179                     fs.Dispose();
    180                 }
    181             }
    182             GC.Collect();
    183             GC.Collect(1);
    184 
    185             return result;
    186         }
    187 
    188         /// <summary>   
    189         /// 压缩文件   
    190         /// </summary>   
    191         /// <param name="fileToZip">要压缩的文件全名</param>   
    192         /// <param name="zipedFile">压缩后的文件名</param>   
    193         /// <returns>压缩结果</returns>   
    194         public bool ZipFile(string fileToZip, string zipedFile)
    195         {
    196             bool result = ZipFile(fileToZip, zipedFile, null);
    197             return result;
    198         }
    199 
    200         /// <summary>   
    201         /// 压缩文件或文件夹   
    202         /// </summary>   
    203         /// <param name="fileToZip">要压缩的路径</param>   
    204         /// <param name="zipedFile">压缩后的文件名</param>   
    205         /// <param name="password">密码</param>   
    206         /// <returns>压缩结果</returns>   
    207         public bool Zip(string fileToZip, string zipedFile, string password)
    208         {
    209             bool result = false;
    210             if (Directory.Exists(fileToZip))
    211             {
    212                 this.rootPath = Path.GetDirectoryName(fileToZip);
    213                 result = ZipDirectory(fileToZip, zipedFile, password);
    214             }
    215             else if (File.Exists(fileToZip))
    216             {
    217                 this.rootPath = Path.GetDirectoryName(fileToZip);
    218                 result = ZipFile(fileToZip, zipedFile, password);
    219             }
    220             return result;
    221         }
    222 
    223         /// <summary>   
    224         /// 压缩文件或文件夹   
    225         /// </summary>   
    226         /// <param name="fileToZip">要压缩的路径</param>   
    227         /// <param name="zipedFile">压缩后的文件名</param>   
    228         /// <returns>压缩结果</returns>   
    229         public bool Zip(string fileToZip, string zipedFile)
    230         {
    231             bool result = Zip(fileToZip, zipedFile, null);
    232             return result;
    233 
    234         }
    235 
    236         #endregion
    237 
    238         #region 解压  
    239 
    240         /// <summary>   
    241         /// 解压功能(解压压缩文件到指定目录)   
    242         /// </summary>   
    243         /// <param name="fileToUnZip">待解压的文件</param>   
    244         /// <param name="zipedFolder">指定解压目标目录</param>   
    245         /// <param name="password">密码</param>   
    246         /// <returns>解压结果</returns>   
    247         public bool UnZip(string fileToUnZip, string zipedFolder, string password)
    248         {
    249             bool result = true;
    250             FileStream fs = null;
    251             ZipInputStream zipStream = null;
    252             ZipEntry ent = null;
    253             string fileName;
    254 
    255             if (!File.Exists(fileToUnZip))
    256                 return false;
    257 
    258             if (!Directory.Exists(zipedFolder))
    259                 Directory.CreateDirectory(zipedFolder);
    260 
    261             try
    262             {
    263                 zipStream = new ZipInputStream(File.OpenRead(fileToUnZip));
    264                 if (!string.IsNullOrEmpty(password)) zipStream.Password = password;
    265                 while ((ent = zipStream.GetNextEntry()) != null)
    266                 {
    267                     if (!string.IsNullOrEmpty(ent.Name))
    268                     {
    269                         fileName = Path.Combine(zipedFolder, ent.Name);
    270                         fileName = fileName.Replace('/', '\');//change by Mr.HopeGi   
    271 
    272                         if (fileName.EndsWith("\"))
    273                         {
    274                             Directory.CreateDirectory(fileName);
    275                             continue;
    276                         }
    277 
    278                         fs = File.Create(fileName);
    279                         int size = 2048;
    280                         byte[] data = new byte[size];
    281                         while (true)
    282                         {
    283                             size = zipStream.Read(data, 0, data.Length);
    284                             if (size > 0)
    285                                 fs.Write(data, 0, data.Length);
    286                             else
    287                                 break;
    288                         }
    289                     }
    290                 }
    291             }
    292             catch
    293             {
    294                 result = false;
    295             }
    296             finally
    297             {
    298                 if (fs != null)
    299                 {
    300                     fs.Close();
    301                     fs.Dispose();
    302                 }
    303                 if (zipStream != null)
    304                 {
    305                     zipStream.Close();
    306                     zipStream.Dispose();
    307                 }
    308                 if (ent != null)
    309                 {
    310                     ent = null;
    311                 }
    312                 GC.Collect();
    313                 GC.Collect(1);
    314             }
    315             return result;
    316         }
    317 
    318         /// <summary>   
    319         /// 解压功能(解压压缩文件到指定目录)   
    320         /// </summary>   
    321         /// <param name="fileToUnZip">待解压的文件</param>   
    322         /// <param name="zipedFolder">指定解压目标目录</param>   
    323         /// <returns>解压结果</returns>   
    324         public bool UnZip(string fileToUnZip, string zipedFolder)
    325         {
    326             bool result = UnZip(fileToUnZip, zipedFolder, null);
    327             return result;
    328         }
    329 
    330         #endregion
    331     }
    332 }
    View Code

    主窗体代码如下:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.IO;
      7 using System.Linq;
      8 using System.Text;
      9 using System.Threading.Tasks;
     10 using System.Windows.Forms;
     11 
     12 namespace ZipUnzip
     13 {
     14     public partial class FrmMain : Form
     15     {
     16         public FrmMain()
     17         {
     18             InitializeComponent();
     19         }
     20 
     21         /// <summary>
     22         /// Unzip/Zip Operation
     23         /// </summary>
     24         /// <param name="sender"></param>
     25         /// <param name="e"></param>
     26         private void chbZip_CheckedChanged(object sender, EventArgs e)
     27         {
     28             if (this.chbZip.Checked)
     29             {
     30                 if (this.chbUnzip.Checked)
     31                 {
     32                     this.chbUnzip.Checked = false;
     33                 }
     34             }
     35         }
     36 
     37         /// <summary>
     38         /// Unzip/Zip Operation
     39         /// </summary>
     40         /// <param name="sender"></param>
     41         /// <param name="e"></param>
     42         private void chbUnzip_CheckedChanged(object sender, EventArgs e)
     43         {
     44             if (this.chbUnzip.Checked)
     45             {
     46                 if (this.chbZip.Checked)
     47                 {
     48                     this.chbZip.Checked = false;
     49                 }
     50             }
     51         }
     52 
     53         /// <summary>
     54         /// Choose File Directory
     55         /// </summary>
     56         /// <param name="sender"></param>
     57         /// <param name="e"></param>
     58         private void btnChoose_Click(object sender, EventArgs e)
     59         {
     60             if (this.chbZip.Checked)
     61             {
     62                 FolderBrowserDialog folderDialog = new FolderBrowserDialog();
     63                 folderDialog.Description = "Choose File Directory";
     64                 folderDialog.RootFolder = Environment.SpecialFolder.Desktop;
     65                 DialogResult dr = folderDialog.ShowDialog(this);
     66                 if (dr == DialogResult.OK)
     67                 {
     68                     this.txtSFP.Text = folderDialog.SelectedPath;
     69                 }
     70             }
     71             else if (this.chbUnzip.Checked)
     72             {
     73                 OpenFileDialog fileDialog = new OpenFileDialog();
     74                 fileDialog.Title = "Choose Zip Files";
     75                 fileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
     76                 DialogResult dr = fileDialog.ShowDialog(this);
     77                 if (dr == DialogResult.OK)
     78                 {
     79                     this.txtSFP.Text = fileDialog.FileName;
     80                 }
     81             }
     82         }
     83 
     84         /// <summary>
     85         /// Zip/Unzip
     86         /// </summary>
     87         /// <param name="sender"></param>
     88         /// <param name="e"></param>
     89         private void btnDo_Click(object sender, EventArgs e)
     90         {
     91             // Check
     92             if ((!this.chbZip.Checked) & (!this.chbUnzip.Checked))
     93             {
     94                 MessageBox.Show("Please choose operation type!", "Error");
     95                 return;
     96             }
     97             // Zip
     98             if (this.chbZip.Checked)
     99             {
    100                 try
    101                 {
    102                     string src = this.txtSFP.Text;
    103                     string dest = AppDomain.CurrentDomain.BaseDirectory + @"zipfolderIP" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".zip";
    104                     if (!Directory.Exists(Path.GetDirectoryName(dest)))
    105                     {
    106                         Directory.CreateDirectory(Path.GetDirectoryName(dest));
    107                     }
    108                     ZipHelper zipHelper = new ZipHelper();
    109                     bool flag = zipHelper.Zip(src, dest);
    110                     if (flag)
    111                     {
    112                         SaveFileDialog fileDialog = new SaveFileDialog();
    113                         fileDialog.Title = "Save Zip Package";
    114                         fileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    115                         fileDialog.FileName = Path.GetFileName(dest);
    116                         if (fileDialog.ShowDialog() == DialogResult.OK)
    117                         {
    118                             File.Copy(dest, fileDialog.FileName, true);
    119                             this.txtDFP.Text = fileDialog.FileName;
    120                         }
    121                         MessageBox.Show(this, "Zip Success!", "Info", MessageBoxButtons.OK);
    122                     }
    123                     else
    124                     {
    125                         MessageBox.Show(this, "Zip Failed", "Error", MessageBoxButtons.OK);
    126                     }
    127                 }
    128                 catch (Exception ex)
    129                 {
    130                     MessageBox.Show("Zip Failed, Err info[" + ex.Message + "]", "Error");
    131                 }
    132 
    133             }
    134 
    135             // Unzip
    136             if (this.chbUnzip.Checked)
    137             {
    138                 try
    139                 {
    140                     FolderBrowserDialog folderDialog = new FolderBrowserDialog();
    141                     folderDialog.Description = "Choose Unzip Directory";
    142                     folderDialog.RootFolder = Environment.SpecialFolder.Desktop;
    143                     DialogResult dr = folderDialog.ShowDialog(this);
    144                     if (dr == DialogResult.OK)
    145                     {
    146                         string destPath = folderDialog.SelectedPath + @"" + Path.GetFileNameWithoutExtension(this.txtDFP.Text);
    147                         ZipHelper zipHelper = new ZipHelper();
    148                         zipHelper.UnZip(this.txtSFP.Text, destPath);
    149                         this.txtDFP.Text = destPath;
    150                     }
    151                     MessageBox.Show("Unzip Success!", "Info");
    152                 }
    153                 catch (Exception ex)
    154                 {
    155                     MessageBox.Show("Unzip Failed, Err info[" + ex.Message + "]", "Error");
    156                 }
    157 
    158             }
    159         }
    160     }
    161 }
    View Code

    实现效果

      作者:Jeremy.Wu
      出处:https://www.cnblogs.com/jeremywucnblog/
      本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Neko's loop HDU-6444(网络赛1007)
    Parameters
    SETLOCAL
    RD / RMDIR Command
    devenv 命令用法
    Cannot determine the location of the VS Common Tools folder.
    'DEVENV' is not recognized as an internal or external command,
    How to change Visual Studio default environment setting
    error signing assembly unknown error
    What is the Xcopy Command?:
  • 原文地址:https://www.cnblogs.com/jeremywucnblog/p/11896016.html
Copyright © 2011-2022 走看看