C# 压缩文件。如何提取或跳过名称中包含无效字符的文件?

Posted

技术标签:

【中文标题】C# 压缩文件。如何提取或跳过名称中包含无效字符的文件?【英文标题】:C# ZipFile. How to extract or skip file with invalid characters in the name? 【发布时间】:2016-05-09 19:00:55 【问题描述】:

我在 .zip 存档中有一个名为 “The Shooting Star”.jpeg 的文件。 当我尝试通过ZipFile.ExtractToDirectoryZipArchiveEntry.ExtractToFile 提取它时,我得到System.ArgumentException: Illegal characters in path 异常。

此类文件已通过 WinRar 成功解压。

有没有办法使用 ZipFile 避免异常并成功提取文件或至少跳过此类文件?

更新:

上传上述存档:The Archive

【问题讨论】:

为什么你的文件名中有引号?您不能在标准 Windows 文件名中包含这些内容,因此应该很清楚问题出在哪里。 @DangerZone,这些是特殊符号,而不是 " 引号,所以它们可以工作。 啊,没注意到。 你还有什么奇怪的字符吗?我无法使用相同的 ZipFile.ExtractToDirectory() 方法复制任何同名文件的问题。 @DangerZone,我没有。我专门测试了这些:“”字符是问题所在。 Windows 资源管理器也无法提取名称中的文件。如果这很重要,我正在使用 Windows 7。 【参考方案1】:

您可以重新格式化源名称以从源名称中删除非法字符。

 var illegalChars = Path.GetInvalidFileNameChars();
 var destName = sourceName.Where(x => !illegalChars.Contains(x)).Aggregate("", (current, x) => current + x);

sourceName 是存档中的文件名,然后您可以使用 ZipArchiveEntry.ExtractToFile 并给它一个更正的目标文件名。

【讨论】:

我根本无法访问存档中的文件,这就是问题所在。

以上是关于C# 压缩文件。如何提取或跳过名称中包含无效字符的文件?的主要内容,如果未能解决你的问题,请参考以下文章

C#从数据库中提取数据生成XML文件,系统报错,提示"♀(十六进制值0x0c)是无效的字符"

ZipFile (System.IO.Compression)、c# (WPF) 的字符提取问题

如何不在生成的命名空间中包含 Visual Studio 项目文件夹名称

如何删除或跳过字符串中的多个新行?

如何在 React 和 JSX 中导入名称中包含特殊字符的 JS 文件?

中继:有条件地在突变的胖查询中包含字段