Устранение рисков: разделитель пути ZipArchiveEntry.FullName

Начиная с приложений, предназначенных для платформа .NET Framework 4.6.1, разделитель путей, используемый в свойстве, изменился с обратной косой черты ("\"), используемой в ZipArchiveEntry.FullName предыдущих версиях платформа .NET Framework на косую черту вперед ("/"). Объекты System.IO.Compression.ZipArchiveEntry создаются путем вызова одной из перегрузок метода ZipFile.CreateFromDirectory.

Воздействие

Изменение обеспечивает соответствие реализации .NET разделу 4.4.17.1 спецификации формата ZIP-файла и позволяет распаковывать ZIP-архивы в системах, отличных от Windows.

При распаковке ZIP-файла, созданного приложением, предназначенным для предыдущей версии платформы .NET Framework, в операционных системах, отличающихся от Windows, таких как MacOS, не удается сохранить структуру каталогов. Например, в MacOS он создает набор файлов, имя файла которых объединяет путь к каталогу, все символы обратной косой черты ("\") и имя файла. В результате структура каталогов распакованных файлов не сохраняется.

Влияние этого изменения на файлы .ZIP, которые распаковываются в операционной системе Windows api в пространстве имен платформа .NET FrameworkSystem.IO, должны быть минимальными, так как эти API могут легко обрабатывать косую черту ("/") или обратную косую черту ("\") в качестве символа разделителя пути.

Исправление

Если это поведение нежелательно, можно отказаться, добавив параметр конфигурации в <раздел среды выполнения> файла конфигурации приложения. Ниже показаны как раздел <runtime>, так и параметр отключения функции.

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

Кроме того, приложения, предназначенные для предыдущих версий платформа .NET Framework, но выполняются в платформа .NET Framework 4.6.1 и более поздних версиях, могут использовать это поведение, добавив параметр конфигурации в <раздел среды выполнения> файла конфигурации приложения. Ниже показаны как раздел <runtime>, так и параметр включения функции.

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

См. также