缓解:ZipArchiveEntry.FullName 路径分隔符

从面向 .NET Framework 4.6.1 的应用开始,属性 ZipArchiveEntry.FullName 中使用的路径分隔符已从以前版本的 .NET Framework 中使用的反斜杠(“\”)更改为正斜杠(“/)。 通过调用 System.IO.Compression.ZipArchiveEntry 方法的某个重载来创建 ZipFile.CreateFromDirectory 对象。

影响

该更改使 .NET 实现遵循 .ZIP 文件格式规范的 4.4.17.1 部分,还允许 .ZIP 存档在非 Windows 系统上进行解压缩。

解压缩由面向非 Windows作系统(如 MacOS)上早期版本的 .NET Framework 的应用创建的 zip 文件无法保留目录结构。 例如,在 MacOS 上,它会创建一组文件,其文件名连接目录路径、任何反斜杠(“\”)字符和文件名。 因此,不会保留解压缩的文件的目录结构。

此更改对 .NET Framework System.IO 命名空间中的 API 在 Windows作系统上解压缩的.ZIP文件的影响应最小,因为这些 API 可以无缝处理斜杠(“/”)或反斜杠(“\”)作为路径分隔符。

缓解措施

如果此行为不可取,可以通过将配置设置添加到 <应用程序配置文件的运行时> 部分来选择退出。 下面展示了 <runtime> 部分和选择禁用此行为的开关。

<runtime>  
   <AppContextSwitchOverrides value="Switch.System.IO.Compression.ZipFile.UseBackslash=true" />  
</runtime>  

此外,对于面向先前版本的 .NET Framework,但在 .NET Framework 4.6.1 及更高版本上运行的应用,可通过将配置设置添加到应用程序配置文件的 <runtime> 部分来选择启用此行为。 下面展示了 <runtime> 部分和选择启用此行为的开关。

<runtime>  
   <AppContextSwitchOverrides value="Switch.System.IO.Compression.ZipFile.UseBackslash=false" />  
</runtime>  

另请参阅