当前位置:
首页 > Python基础教程 >
-
C#教程之C# 文件/文件夹压缩解压缩
项目上用到的,随手做个记录,哈哈。
直接上代码:
1 using System; 2 using System.Data; 3 using System.Configuration; 4 using System.Collections.Generic; 5 using System.IO; 6 using ICSharpCode.SharpZipLib.Zip; 7 using ICSharpCode.SharpZipLib.Checksums; 8 namespace BLL 9 { 10 /// <summary> 11 /// 文件(夹)压缩、解压缩 12 /// </summary> 13 public class FileCompression 14 { 15 #region 压缩文件 16 /// <summary> 17 /// 压缩文件 18 /// </summary> 19 /// <param name="fileNames">要打包的文件列表</param> 20 /// <param name="GzipFileName">目标文件名</param> 21 /// <param name="CompressionLevel">压缩品质级别(0~9)</param> 22 /// <param name="deleteFile">是否删除原文件</param> 23 public static void CompressFile(List<FileInfo> fileNames, string GzipFileName, int CompressionLevel, bool deleteFile) 24 { 25 ZipOutputStream s = new ZipOutputStream(File.Create(GzipFileName)); 26 try 27 { 28 s.SetLevel(CompressionLevel); //0 - store only to 9 - means best compression 29 foreach (FileInfo file in fileNames) 30 { 31 FileStream fs = null; 32 try 33 { 34 fs = file.Open(FileMode.Open, FileAccess.ReadWrite); 35 } 36 catch 37 { continue; } 38 // 方法二,将文件分批读入缓冲区 39 byte[] data = new byte[2048]; 40 int size = 2048; 41 ZipEntry entry = new ZipEntry(Path.GetFileName(file.Name)); 42 entry.DateTime = (file.CreationTime > file.LastWriteTime ? file.LastWriteTime : file.CreationTime); 43 s.PutNextEntry(entry); 44 while (true) 45 { 46 size = fs.Read(data, 0, size); 47 if (size <= 0) break; 48 s.Write(data, 0, size); 49 } 50 fs.Close(); 51 if (deleteFile) 52 { 53 file.Delete(); 54 } 55 } 56 } 57 finally 58 { 59 s.Finish(); 60 s.Close(); 61 } 62 } 63 /// <summary> 64 /// 压缩文件夹 65 /// </summary> 66 /// <param name="dirPath">要打包的文件夹</param> 67 /// <param name="GzipFileName">目标文件名</param> 68 /// <param name="CompressionLevel">压缩品质级别(0~9)</param> 69 /// <param name="deleteDir">是否删除原文件夹</param> 70 public static void CompressDirectory(string dirPath, string GzipFileName, int CompressionLevel, bool deleteDir) 71 { 72 //压缩文件为空时默认与压缩文件夹同一级目录 73 if (GzipFileName == string.Empty) 74 { 75 GzipFileName = dirPath.Substring(dirPath.LastIndexOf("//") + 1); 76 GzipFileName = dirPath.Substring(0, dirPath.LastIndexOf("//")) + "//" + GzipFileName + ".zip"; 77 } 78 //if (Path.GetExtension(GzipFileName) != ".zip") 79 //{ 80 // GzipFileName = GzipFileName + ".zip"; 81 //} 82 using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(GzipFileName))) 83 { 84 zipoutputstream.SetLevel(CompressionLevel); 85 Crc32 crc = new Crc32(); 86 Dictionary<string, DateTime> fileList = GetAllFies(dirPath); 87 foreach (KeyValuePair<string, DateTime> item in fileList) 88 { 89 FileStream fs = File.OpenRead(item.Key.ToString()); 90 byte[] buffer = new byte[fs.Length]; 91 fs.Read(buffer, 0, buffer.Length); 92 ZipEntry entry = new ZipEntry(item.Key.Substring(dirPath.Length)); 93 entry.DateTime = item.Value; 94 entry.Size = fs.Length; 95 fs.Close(); 96 crc.Reset(); 97 crc.Update(buffer); 98 entry.Crc = crc.Value; 99 zipoutputstream.PutNextEntry(entry); 100 zipoutputstream.Write(buffer, 0, buffer.Length); 101 } 102 } 103 if (deleteDir) 104 { 105 Directory.Delete(dirPath, true); 106 } 107 } 108 /// <summary> 109 /// 获取所有文件 110 /// </summary> 111 /// <returns></returns> 112 private static Dictionary<string, DateTime> GetAllFies(string dir) 113 { 114 Dictionary<string, DateTime> FilesList = new Dictionary<string, DateTime>(); 115 DirectoryInfo fileDire = new DirectoryInfo(dir); 116 if (!fileDire.Exists) 117 { 118 throw new System.IO.FileNotFoundException("目录:" + fileDire.FullName + "没有找到!"); 119 } 120 GetAllDirFiles(fileDire, FilesList); 121 GetAllDirsFiles(fileDire.GetDirectories(), FilesList); 122 return FilesList; 123 } 124 /// <summary> 125 /// 获取一个文件夹下的所有文件夹里的文件 126 /// </summary> 127 /// <param name="dirs"></param> 128 /// <param name="filesList"></param> 129 private static void GetAllDirsFiles(DirectoryInfo[] dirs, Dictionary<string, DateTime> filesList) 130 { 131 foreach (DirectoryInfo dir in dirs) 132 { 133 foreach (FileInfo file in dir.GetFiles("*.*")) 134 { 135 filesList.Add(file.FullName, file.LastWriteTime); 136 } 137 GetAllDirsFiles(dir.GetDirectories(), filesList); 138 } 139 } 140 /// <summary> 141 /// 获取一个文件夹下的文件 142 /// </summary> 143 /// <param name="dir">目录名称</param> 144 /// <param name="filesList">文件列表HastTable</param> 145 private static void GetAllDirFiles(DirectoryInfo dir, Dictionary<string, DateTime> filesList) 146 { 147 foreach (FileInfo file in dir.GetFiles("*.*")) 148 { 149 filesList.Add(file.FullName, file.LastWriteTime); 150 } 151 } 152 #endregion 153 #region 解压缩文件 154 /// <summary> 155 /// 解压缩文件 156 /// </summary> 157 /// <param name="GzipFile">压缩包文件名</param> 158 /// <param name="targetPath">解压缩目标路径</param> 159 public static void Decompress(string GzipFile, string targetPath) 160 { 161 //string directoryName = Path.GetDirectoryName(targetPath + "//") + "//"; 162 string directoryName = targetPath; 163 if (!Directory.Exists(directoryName)) Directory.CreateDirectory(directoryName);//生成解压目录 164 string CurrentDirectory = directoryName; 165 byte[] data = new byte[2048]; 166 int size = 2048; 167 ZipEntry theEntry = null; 168 using (ZipInputStream s = new ZipInputStream(File.OpenRead(GzipFile))) 169 { 170 while ((theEntry = s.GetNextEntry()) != null) 171 { 172 if (theEntry.IsDirectory) 173 {// 该结点是目录 174 if (!Directory.Exists(CurrentDirectory + theEntry.Name)) Directory.CreateDirectory(CurrentDirectory + theEntry.Name); 175 } 176 else 177 { 178 if (theEntry.Name != String.Empty) 179 { 180 // 检查多级目录是否存在 181 if (theEntry.Name.Contains("//")) 182 { 183 string parentDirPath = theEntry.Name.Remove(theEntry.Name.LastIndexOf("//") + 1); 184 if (!Directory.Exists(parentDirPath)) 185 { 186 Directory.CreateDirectory(CurrentDirectory + parentDirPath); 187 } 188 } 189 190 //解压文件到指定的目录 191 using (FileStream streamWriter = File.Create(CurrentDirectory + theEntry.Name)) 192 { 193 while (true) 194 { 195 size = s.Read(data, 0, data.Length); 196 if (size <= 0) break; 197 streamWriter.Write(data, 0, size); 198 } 199 streamWriter.Close(); 200 } 201 } 202 } 203 } 204 s.Close(); 205 } 206 } 207 #endregion 208 } 209 }
封装的很彻底,基本不用修改什么,直接拿来用就行了。
找了很久,终于知道怎么把源代码附上了
源代码:https://files.cnblogs.com/files/hahahayang/C%E5%8E%8B%E7%BC%A9%E6%96%87%E4%BB%B6.zip
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式