共用方式為


風險降低:ZipArchiveEntry.FullName 路徑分隔符

從以 .NET Framework 4.6.1 為目標的應用程式開始,屬性中使用的 ZipArchiveEntry.FullName 路徑分隔符已從舊版 .NET Framework 中使用的反斜杠 (“\”) 變更為正斜線 (“/” )。 System.IO.Compression.ZipArchiveEntry 物件是透過呼叫ZipFile.CreateFromDirectory 方法的其中一個多載建立的。

影響

這項變更使得 .NET 實作遵守 .ZIP File Format Specification (.ZIP 檔案格式規格) 的 4.4.17.1 小節,並允許在非 Windows 系統上解壓縮 ZIP 封存。

解壓縮由以舊版 .NET Framework 為目標的應用程式在如 macOS 等非 Windows 作業系統上建立的 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>  
   <AppContextSwitchOverrides value="Switch.System.IO.Compression.ZipFile.UseBackslash=false" />  
</runtime>  

另請參閱