1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 完美解决C#解压缩指定文件/文件夹 中文乱码问题

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

时间:2018-10-28 02:36:55

相关推荐

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

完美解决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

链接:/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依旧乱码,哪位大佬如果有其他方法,请留言更正,谢谢~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。