当使用System.IO.Compression.ZipFile.CreateFromDirectory .NET类时,在使用正斜杠目录分隔符的系统上,结果压缩包被严重解压。
原因: zip名称中包含反斜杠
发布于 2014-12-04 16:13:45
要解决此问题,可以使用以下解决方法:
class MyEncoder : UTF8Encoding
{
public MyEncoder()
{
}
public override byte[] GetBytes(string s)
{
s = s.Replace("\\", "/");
return base.GetBytes(s);
}
}
System.IO.Compression.ZipFile.CreateFromDirectory("C:/ABC", "C:/tmp/ABC.zip", CompressionLevel.Fastest, false, new MyEncoder());
发布于 2017-02-23 05:20:12
微软有addressed this in .NET 4.6.1
从面向.NET框架4.6.1的应用程序开始,ZipArchiveEntry.FullName属性中使用的路径分隔符已从以前版本的.NET框架中使用的反斜杠("\")更改为正斜杠("/")。通过调用ZipFile.CreateFromDirectory方法的一个重载来创建System.IO.Compression.ZipArchiveEntry对象。
注意:
此外,针对以前版本的.NET框架但在.NET框架4.6.1和更高版本上运行的应用程序可以通过将配置设置添加到应用程序配置文件的部分来选择加入此行为。
发布于 2016-09-14 03:07:37
此问题的正确解决方法如下
class MyEncoder : UTF8Encoding
{
public MyEncoder() : base(true)
{
}
public override byte[] GetBytes(string s)
{
s = s.Replace("\\", "/");
return base.GetBytes(s);
}
}
注意:这与之前的答案略有不同。
关键的区别在于: base(true)
这一点很重要,否则.NET ZipArchive类将不会将编码器识别为UTF-8编码器,并且不会标记正确的通用位,因此使用任何其他压缩程序提取得到的压缩文件将假定压缩条目名称采用的是非unicode编码,这可能导致文件名损坏。
原因是.NET中的内部调用检查自定义编码器是否为.equals(Encoding.UTF8)
,除非为encoderShouldEmitUTF8Identifier传递true
(如Encoding.UTF8 ),否则这不是真的
https://stackoverflow.com/questions/27289115
复制相似问题