完美解决C#解压缩中文乱码问题

  • 只为记录自己踩过的坑, 亲测 ! ! !
  • 项目用到的 ICSharpCode.SharpZipLib.dll
  • 最终问题定位在这里,帮助类ZipHelper里面少了句代码
  • 以下是帮助类的完整代码
  • 经过网友提问,验证出了只在NetFramework 不会乱码,NetCore依旧乱码,哪位大佬如果有其他方法,请留言更正,谢谢~

最近因为公司项目,要写一个FTP自动上传 删除,下载…
要把文件夹压缩后再上传.我使用的 ICSharpCode.SharpZipLib.dll(版本:0.86.0 是在官网下载的,当然有最新的1.3.3,因为我用的是 .NetFramework 3.5)
在网上各种找帮助类Helper,最终发现压缩一会都会乱码,解决了文件名有中文乱码,但是文件夹却还是乱码,折腾了一整天, 终于找到问题所在.自己改了一下Helper, 如有问题,请各位指出.

只为记录自己踩过的坑, 亲测 ! ! !

项目用到的 ICSharpCode.SharpZipLib.dll

链接:https://pan.baidu.com/s/1azMmYHecaLU4WBtiEgjeYw
提取码:pi9l

最终问题定位在这里,帮助类ZipHelper里面少了句代码

    ZipEntry ZipEntry = new ZipEntry(fileName);//因为帮助类里面少了这句代码,设置字符集,解决乱码ZipEntry.IsUnicodeText = true;

以下是帮助类的完整代码

using System;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;/// <summary>
/// 压缩类
/// </summary>
public class ZipHelper
{/// <summary>/// ZIP:解压一个zip文件/// </summary>/// <param name="ZipFile">需要解压的Zip文件(绝对路径)</param>/// <param name="TargetDirectory">解压到的目录</param>/// <param name="Password">解压密码</param>/// <param name="OverWrite">是否覆盖已存在的文件</param>public static void UnZip(string ZipFile, string TargetDirectory, string Password, bool OverWrite = true){//如果解压到的目录不存在,则报错if (!System.IO.Directory.Exists(TargetDirectory)){throw new System.IO.FileNotFoundException("指定的目录: " + TargetDirectory + " 不存在!");}//目录结尾if (!TargetDirectory.EndsWith("\\")) { TargetDirectory = TargetDirectory + "\\"; }using (ZipInputStream zipfiles = new ZipInputStream(File.OpenRead(ZipFile))){zipfiles.Password = Password;ZipEntry theEntry;while ((theEntry = zipfiles.GetNextEntry()) != null){theEntry.IsUnicodeText = true;//解决乱码string directoryName = "";string pathToZip = "";pathToZip = theEntry.Name;if (pathToZip != "")directoryName = Path.GetDirectoryName(pathToZip) + "\\";string fileName = Path.GetFileName(pathToZip);Directory.CreateDirectory(TargetDirectory + directoryName);if (fileName != ""){if ((File.Exists(TargetDirectory + directoryName + fileName) && OverWrite) || (!File.Exists(TargetDirectory + directoryName + fileName))){using (FileStream streamWriter = File.Create(TargetDirectory + directoryName + fileName)){int size = 2048;byte[] data = new byte[2048];while (true){size = zipfiles.Read(data, 0, data.Length);if (size > 0)streamWriter.Write(data, 0, size);elsebreak;}streamWriter.Close();}}}}zipfiles.Close();}}/// <summary>/// ZIP:压缩单个文件/// </summary>/// <param name="FileToZip">需要压缩的文件(绝对路径)</param>/// <param name="ZipedPath">压缩后的文件路径(绝对路径)</param>/// <param name="ZipedFileName">压缩后的文件名称(文件名,默认 同源文件同名)</param>/// <param name="CompressionLevel">压缩等级(0 无 - 9 最高,默认 5)</param>/// <param name="BlockSize">缓存大小(每次写入文件大小,默认 2048)</param>/// <param name="IsEncrypt">是否加密(默认 加密)</param>public static void ZipFile(string FileToZip, string ZipedPath, string ZipedFileName = "", int CompressionLevel = 5, int BlockSize = 2048, bool IsEncrypt = true){//如果文件没有找到,则报错if (!System.IO.File.Exists(FileToZip)){throw new System.IO.FileNotFoundException("指定要压缩的文件: " + FileToZip + " 不存在!");}//文件名称(默认同源文件名称相同)string ZipFileName = string.IsNullOrEmpty(ZipedFileName) ? ZipedPath + "\\" + new FileInfo(FileToZip).Name.Substring(0, new FileInfo(FileToZip).Name.LastIndexOf('.')) + ".zip" : ZipedPath + "\\" + ZipedFileName + ".zip";using (System.IO.FileStream ZipFile = System.IO.File.Create(ZipFileName)){using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile)){using (System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read)){string fileName = FileToZip.Substring(FileToZip.LastIndexOf("\\") + 1);ZipEntry ZipEntry = new ZipEntry(fileName);ZipEntry.IsUnicodeText = true;//解决乱码if (IsEncrypt){//压缩文件加密ZipStream.Password = "123";}ZipStream.PutNextEntry(ZipEntry);//设置压缩级别ZipStream.SetLevel(CompressionLevel);//缓存大小byte[] buffer = new byte[BlockSize];int sizeRead = 0;try{do{sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);ZipStream.Write(buffer, 0, sizeRead);}while (sizeRead > 0);}catch (System.Exception ex){throw ex;}StreamToZip.Close();}ZipStream.Finish();ZipStream.Close();}ZipFile.Close();}}/// <summary>/// ZIP:压缩文件夹/// </summary>/// <param name="DirectoryToZip">需要压缩的文件夹(绝对路径)</param>/// <param name="ZipedPath">压缩后的文件路径(绝对路径)</param>/// <param name="ZipedFileName">压缩后的文件名称(文件名,默认 同源文件夹同名)</param>/// <param name="IsEncrypt">是否加密(默认 加密)</param>public static void ZipDirectory(string DirectoryToZip, string ZipedPath, string ZipedFileName = "", bool IsEncrypt = true){//如果目录不存在,则报错if (!System.IO.Directory.Exists(DirectoryToZip)){throw new System.IO.FileNotFoundException("指定的目录: " + DirectoryToZip + " 不存在!");}//文件名称(默认同源文件名称相同)string ZipFileName = string.IsNullOrEmpty(ZipedFileName) ? ZipedPath + "\\" + new DirectoryInfo(DirectoryToZip).Name + ".zip" : ZipedPath + "\\" + ZipedFileName + ".zip";using (System.IO.FileStream ZipFile = System.IO.File.Create(ZipFileName)){using (ZipOutputStream s = new ZipOutputStream(ZipFile)){if (IsEncrypt){//压缩文件加密s.Password = "123";}ZipSetp(DirectoryToZip, s, "");}}}/// <summary>/// 递归遍历目录/// </summary>private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath){if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar){strDirectory += Path.DirectorySeparatorChar;}Crc32 crc = new Crc32();string[] filenames = Directory.GetFileSystemEntries(strDirectory);foreach (string file in filenames)// 遍历所有的文件和目录{if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件{string pPath = parentPath;pPath += file.Substring(file.LastIndexOf("\\") + 1);pPath += "\\";ZipSetp(file, s, pPath);}else // 否则直接压缩文件{//打开压缩文件using (FileStream fs = File.OpenRead(file)){byte[] buffer = new byte[fs.Length];fs.Read(buffer, 0, buffer.Length);string fileName = parentPath + file.Substring(file.LastIndexOf("\\") + 1);ZipEntry entry = new ZipEntry(fileName);entry.IsUnicodeText = true;//解决乱码entry.DateTime = DateTime.Now;entry.Size = fs.Length;fs.Close();crc.Reset();crc.Update(buffer);entry.Crc = crc.Value;s.PutNextEntry(entry);s.Write(buffer, 0, buffer.Length);}}}}
}

经过网友提问,验证出了只在NetFramework 不会乱码,NetCore依旧乱码,哪位大佬如果有其他方法,请留言更正,谢谢~

完美解决C#解压缩指定文件/文件夹 中文乱码问题相关推荐

  1. linux把u盘只读文件,完美解决linux下U盘文件只读的问题

    完美解决linux下U盘文件只读的问题 1. 在终端运行如下命令 tail -f /var/log/syslog 2. 插入有只读文件系统故障的U盘 3. 观察命令行输出 输出局部如下: Jul  8 ...

  2. centos挂载u盘只读_完美解决linux下U盘文件只读的问题

    1. 在终端运行如下命令 tail -f /var/log/syslog 2. 插入有只读文件系统故障的U盘 3. 观察命令行输出 输出局部如下: Jul  8 16:44:50 cslouis-pc ...

  3. linux下u盘目录带锁,完美解决linux下U盘文件只读的问题

    1. 在终端运行如下命令 tail -f /var/log/syslog 2. 插入有只读文件系统故障的U盘 3. 观察命令行输出 输出局部如下: Jul  8 16:44:50 cslouis-pc ...

  4. php 上传乱码_如何解决php文件上传中文乱码问题

    php文件上传中文乱码的解决办法:首先打开相应的PHP文件:然后通过"iconv("UTF-8", "gbk",$name)"方法对文件名进 ...

  5. 解决 IntelliJ IDEA 中 .propertise 文件保存后中文乱码

    解决 IntelliJ IDEA 中 .propertise 文件保存后中文乱码 运行环境: IntelliJ IDEA 2021.3 (Ultimate Edition)   在 IntelliJ ...

  6. java读写html文件时出现中文乱码问题的解决方法

    最近在做HTML静态生成,需要从硬盘上把模版文件的内容读出来.然后,替换相关标签写到指定的文件中.无论是读写,都遇到了中文乱码问题.试过多种方法,发现下面一种可以避免中文乱码.(无论读取还是写入一定要 ...

  7. spring使用@Value注解读取.properties文件时出现中文乱码问题的解决

    spring使用@Value注解读取.properties文件时出现中文乱码问题的解决 参考文章: (1)spring使用@Value注解读取.properties文件时出现中文乱码问题的解决 (2) ...

  8. java读txt文件乱码_java读取txt文件时出现中文乱码怎么解决

    java读取txt文件时出现中文乱码怎么解决 发布时间:2020-06-25 15:27:31 来源:亿速云 阅读:105 作者:Leah java读取txt文件时出现中文乱码怎么解决?针对这个问题, ...

  9. linux打开word乱码,解决linux下openoffice word文件转PDF中文乱码的问题

    网上很多介绍是由于jdk中的没有字体导致乱码,而我遇到的是转换过程并未报错,但转换后的PDF中是乱码,尝试在jre/lib/fonts/中增加字体,还是不能解决问题,因此可以判断非jre字体问题,是l ...

最新文章

  1. 【jsp】通过get和post传值的区别
  2. SQL语句之DWL、DCL语句
  3. 基础练习 龟兔赛跑预测
  4. SVD分解及应用的直观理解
  5. 一、Git 多人协作模拟实战
  6. Elasticsearch5.X的java配置
  7. IPv6 相关的工作简介
  8. 雨林木风系统封装工具封装xp_如何用小丸工具大幅度压缩视频且画质损失较小?...
  9. android 应用的资源
  10. lion.ec开源框架简介(原创)
  11. Java中流的使用和说明(二)
  12. 游戏必备组件有哪些_微信广告将升级小程序、小游戏开发者收入方案
  13. 乐回购服务器异常等待修复,楚留香4.26立夏集活动玩法大全 聚沙成塔春尽雅集拄食兆吉奇趣斗蛋张榜升擂迎夏祈福莲舫觅珍曲水台_游侠手游...
  14. Go Flutter Desktop (二) go 二进制程序打包为 mac app(dmg)
  15. 《用 Python 处理 Excel 数据之正则表达式视频教程》 曾贤志
  16. SmokePing安装手册
  17. Hadoop之电信日志数据处理(一)------业务简介
  18. IOS - iPhoneX 怎么进入 DFU 模式(刷机必备)?
  19. session与登录机制
  20. 3dMax场景安全(杀毒)工具安装使用教程

热门文章

  1. 装备合成----三分
  2. (java毕业设计)基于java蛋糕甜品商店管理系统源码
  3. 数据库怎么用Java做封面_在PPT中制作高逼格封面怎样操作?一招教你轻松解决...
  4. Oracle REGEXP_SUBSTR函数介绍
  5. “chm 已取消到该网页的导航”解决方案
  6. Spark Standalone 伪分布模式安装
  7. 深度学习激活函数可视化:tanh与relu的比较
  8. python日历小程序_python写的日历小程序
  9. mysql 数据库重启命令_Mysql数据库常用的启动,停止以及重启操作命令
  10. java8 jstack_JDK自带工具之jstack