首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >System.IO.Compression.ZipFile .NET 4.5输出压缩包不适用于Linux/Mac/Java

System.IO.Compression.ZipFile .NET 4.5输出压缩包不适用于Linux/Mac/Java
EN

Stack Overflow用户
提问于 2014-12-04 16:13:45
回答 3查看 6K关注 0票数 20

当使用System.IO.Compression.ZipFile.CreateFromDirectory .NET类时,在使用正斜杠目录分隔符的系统上,结果压缩包被严重解压。

原因: zip名称中包含反斜杠

EN

回答 3

Stack Overflow用户

发布于 2014-12-04 16:13:45

要解决此问题,可以使用以下解决方法:

代码语言:javascript
复制
    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());
票数 19
EN

Stack Overflow用户

发布于 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和更高版本上运行的应用程序可以通过将配置设置添加到应用程序配置文件的部分来选择加入此行为。

票数 14
EN

Stack Overflow用户

发布于 2016-09-14 03:07:37

此问题的正确解决方法如下

代码语言:javascript
复制
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 ),否则这不是真的

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27289115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档