C#文件或文件夹压缩和解压方法有很多,本文通过使用ICSharpCode.SharpZipLib.dll来进行压缩解压
1、新建一个winform项目,选择项目右键 管理NuGet程序包,搜索ICSharpCode.SharpZipLib,进行安装,
如下所示
2、项目winform窗体添加测试按钮 压缩和解压
3、具体代码如下
using ICSharpCode.SharpZipLib.Checksums; using ICSharpCode.SharpZipLib.Zip; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Text; using System.Windows.Forms; namespace WindowsFormsApp2._0 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Button12_Click(object sender, EventArgs e) { ZipFile(@"F:PersonLongtengLongtengSlnWindowsFormsApp2.0inDebugdevicelog", @"F:PersonLongtengLongtengSlnWindowsFormsApp2.0inDebugdevicelog.zip"); MessageBox.Show("压缩 成功"); } private void Button13_Click(object sender, EventArgs e) { UnZipFile(@"F:PersonLongtengLongtengSlnWindowsFormsApp2.0inDebugdevicelog.zip", @"F:PersonLongtengLongtengSlnWindowsFormsApp2.0inDebugdevicelog11"); MessageBox.Show("解压 成功"); } public void ZipFile(string strFile, string strZip) { if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) { strFile += Path.DirectorySeparatorChar; } ZipOutputStream outstream = new ZipOutputStream(File.Create(strZip)); outstream.SetLevel(6); ZipCompress(strFile, outstream, strFile); outstream.Finish(); outstream.Close(); } public void ZipCompress(string strFile, ZipOutputStream outstream, string staticFile) { if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) { strFile += Path.DirectorySeparatorChar; } Crc32 crc = new Crc32(); //获取指定目录下所有文件和子目录文件名称 string[] filenames = Directory.GetFileSystemEntries(strFile); //遍历文件 foreach (string file in filenames) { if (Directory.Exists(file)) { ZipCompress(file, outstream, staticFile); } //否则,直接压缩文件 else { //打开文件 FileStream fs = File.OpenRead(file); //定义缓存区对象 byte[] buffer = new byte[fs.Length]; //通过字符流,读取文件 fs.Read(buffer, 0, buffer.Length); //得到目录下的文件(比如:D:Debug1 est),test string tempfile = file.Substring(staticFile.LastIndexOf("\") + 1); ZipEntry entry = new ZipEntry(tempfile); entry.DateTime = DateTime.Now; entry.Size = fs.Length; fs.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; outstream.PutNextEntry(entry); //写文件 outstream.Write(buffer, 0, buffer.Length); } } } public string UnZipFile(string TargetFile, string fileDir) { string rootFile = ""; try { if (!Directory.Exists(fileDir)) { Directory.CreateDirectory(fileDir); } //读取压缩文件(zip文件),准备解压缩 ZipInputStream inputstream = new ZipInputStream(File.OpenRead(TargetFile.Trim())); ZipEntry entry; string path = fileDir; //解压出来的文件保存路径 string rootDir = ""; //根目录下的第一个子文件夹的名称 while ((entry = inputstream.GetNextEntry()) != null) { rootDir = Path.GetDirectoryName(entry.Name); //得到根目录下的第一级子文件夹的名称 if (rootDir.IndexOf("\") >= 0) { rootDir = rootDir.Substring(0, rootDir.IndexOf("\") + 1); } string dir = Path.GetDirectoryName(entry.Name); //得到根目录下的第一级子文件夹下的子文件夹名称 string fileName = Path.GetFileName(entry.Name); //根目录下的文件名称 if (dir != "") { //创建根目录下的子文件夹,不限制级别 if (!Directory.Exists(fileDir + "\" + dir)) { path = fileDir + "\" + dir; //在指定的路径创建文件夹 Directory.CreateDirectory(path); } } else if (dir == "" && fileName != "") { //根目录下的文件 path = fileDir; rootFile = fileName; } else if (dir != "" && fileName != "") { //根目录下的第一级子文件夹下的文件 if (dir.IndexOf("\") > 0) { //指定文件保存路径 path = fileDir + "\" + dir; } } if (dir == rootDir) { //判断是不是需要保存在根目录下的文件 path = fileDir + "\" + rootDir; } //以下为解压zip文件的基本步骤 //基本思路:遍历压缩文件里的所有文件,创建一个相同的文件 if (fileName != String.Empty) { FileStream fs = File.Create(path + "\" + fileName); int size = 2048; byte[] data = new byte[2048]; while (true) { size = inputstream.Read(data, 0, data.Length); if (size > 0) { fs.Write(data, 0, size); } else { break; } } fs.Close(); } } inputstream.Close(); return rootFile; } catch (Exception ex) { return ex.Message; } } /// <summary> /// 批量压缩事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnBatchZipFlo_Click(object sender, EventArgs e) { string path1 = "D:\123\"; //待压缩的目录文件 string path2 = "D:\456\"; //压缩后存放目录文件 //获取指定目录下所有文件和子文件名称(所有待压缩的文件) string[] files = Directory.GetFileSystemEntries(path1); //ZipFloClass zc = new ZipFloClass(); //遍历指定目录下文件路径 foreach (string file in files) { //截取文件路径的文件名 var filename = file.Substring(file.LastIndexOf("\") + 1); //调用压缩方法(参数1:待压缩的文件目录,参数2:压缩后的文件目录(包含后缀)) ZipFile(path1 + filename, path2 + filename + ".zip"); } } /// <summary> /// 批量解压事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnBatchUnZipFlo_Click(object sender, EventArgs e) { string msg = ""; string path2 = "D:\123\"; string path3 = "D:\456\"; //获取指定目录下所有文件和子文件名称(所有待解压的压缩文件) string[] files = Directory.GetFileSystemEntries(path2); //UnZipFloClass uzc = new UnZipFloClass(); //遍历所有压缩文件路径 foreach (string file in files) { //获取压缩包名称(包括后缀名) var filename = file.Substring(file.LastIndexOf("\") + 1); //得到压缩包名称(没有后缀) filename = filename.Substring(0, filename.LastIndexOf(".")); //判断解压的路径是否存在 if (!Directory.Exists(path3 + filename)) { //没有,则创建这个路径 Directory.CreateDirectory(path3 + filename); } //调用解压方法(参数1:待解压的压缩文件路径(带后缀名),参数2:解压后存放的文件路径,参数3:返工是否解压成功) UnZipFile(file, path3 + filename); } MessageBox.Show("批量解压成功"); } } }