Mitigação: separador de caminho ZipArchiveEntry.FullName

Começando com aplicativos direcionados ao .NET Framework 4.6.1, o separador de caminho usado na propriedade ZipArchiveEntry.FullName foi alterado da barra invertida ("\") usada nas versões anteriores do .NET Framework para uma barra ("/"). Os objetos System.IO.Compression.ZipArchiveEntry são criados chamando uma das sobrecargas do método ZipFile.CreateFromDirectory.

Impacto

A alteração traz a implementação do .NET em conformidade com a seção 4.4.17.1 da Especificação de formato de arquivo .ZIP e permite que arquivamentos .ZIP sejam descompactados em sistemas não Windows.

A descompactação de um arquivo zip criado por um aplicativo direcionado a uma versão anterior do .NET Framework em sistemas operacionais não Windows, como o MacOS, falha na preservação da estrutura de diretório. Por exemplo, no MacOS, ela cria um conjunto de arquivos cujo nome de arquivo concatena o caminho do diretório com qualquer caractere de barra invertida ("\") e o nome do arquivo. Consequentemente, a estrutura do diretório de arquivos descompactados não é preservada.

O impacto dessa alteração em arquivos .ZIP que são descompactados no sistema operacional Windows por APIs no namespace System.IO do .NET Framework deve ser mínimo, pois essas APIs conseguem lidar perfeitamente com uma barra ("/") ou com uma barra invertida ("\") como o caractere separador de caminho.

Atenuação

Se esse comportamento for indesejável, você poderá recusar adicionando uma definição de configuração à seção <runtime> do seu arquivo de configuração de aplicativo. Veja a seguir a seção <runtime> e a opção de recusa.

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

Além disso, os aplicativos destinados a versões anteriores do .NET Framework, mas estão sendo executados no .NET Framework 4.6.1 e versões posteriores, podem aceitar esse comportamento adicionando uma definição de configuração à seção <runtime> do arquivo de configuração de aplicativo. Veja a seguir a seção <runtime> e a opção de aceitação.

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

Confira também