ZipFile.ExtractToDirectory在目录已存在时为何未按文档抛出异常?
这是不同.NET 实现版本的接口行为差异,你看到的文档备注未适配.NET 5的实际逻辑。
具体原因
ZipFile.ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName)双参数重载的行为在两类.NET 平台上完全不同:- .NET Framework 4.5及以上版本的原始逻辑是:只要目标目录已存在,无论目录内是否有冲突文件,直接抛出
IOException,这就是你在文档备注中看到的「目标目录不得已存在」描述的来源。 - 从.NET Core 2.0开始(.NET 5属于.NET Core后续的统一发行版本,继承了该逻辑),该方法的逻辑做了优化调整:目标目录已存在本身不会触发异常,只有当压缩包内的文件名和目标目录下已存在的文件重名、且未指定覆盖规则时,才会抛出异常。
- .NET Framework 4.5及以上版本的原始逻辑是:只要目标目录已存在,无论目录内是否有冲突文件,直接抛出
- 你测试的两段代码目标目录均为已存在的合法路径,在.NET 5环境下运行无异常完全符合预期。
补充说明
.NET Core 2.1及以上版本新增了三参数重载 ZipFile.ExtractToDirectory(string, string, bool overwriteFiles),你可以通过第三个参数显式指定是否覆盖目标目录下的同名文件,行为可控性更高。
内容的提问来源于stack exchange,提问作者bjorn93
相关产品推荐
相关产品推荐

