ZipArchive Framework 6使用临时文件名引发异常问题求助
临时文件压缩异常问题解决
使用Path.GetTempFileName()生成临时文件名执行压缩操作时会抛出异常,但改用静态文件名则无异常。
相关代码如下:
tmp0 = Path.GetTempFileName(); WriteSomeDataToFileAndClose(tmp0); tmp1 = Path.GetTempFileName(); using (var fileStream = new FileStream(tmp1, FileMode.CreateNew)) { using (ZipArchive zip2 = new ZipArchive(fileStream, ZipArchiveMode.Create)) { zip2.CreateEntryFromFile(tmp0, Path.GetFileNameWithoutExtension(tmp0), CompressionLevel.Fastest); } }
抛出的异常信息翻译为:
System.Windows.Markup.XamlParseException: 调用类型的构造函数时发生异常。
问题根源
Path.GetTempFileName()会在系统临时目录创建一个已存在的空文件,而FileStream的FileMode.CreateNew模式要求目标文件必须不存在,否则会触发底层文件操作异常,最终导致上层抛出XamlParseException。
解决方案
- 修改文件打开模式
将FileMode.CreateNew替换为FileMode.Create,后者会自动覆盖已存在的文件:
using (var fileStream = new FileStream(tmp1, FileMode.Create))
- 生成不存在的临时文件路径
不要用Path.GetTempFileName()生成压缩目标文件路径,改用临时目录结合随机文件名生成不存在的文件:
tmp1 = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString() + ".zip");
这样后续使用FileMode.CreateNew就不会触发文件已存在的异常。
内容的提问来源于stack exchange,提问作者user14369224
相关产品推荐
相关产品推荐

