同一卷不能同时用作源和目标

The same volume can not be used as both the source and destination

我正在使用以下代码创建拆分档案:

string filename = "FileName.pdf";
using (ZipFile zip = new ZipFile())
{
    zip.UseZip64WhenSaving = Zip64Option.Default;
    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.Default;
    using (FileStream stream = new FileStream(temp, FileMode.Open))
    {
        zip.AddEntry(filename, stream);
        zip.MaxOutputSegmentSize = settings.AttachmentSize * (1024 * 1024);
        zip.Save(zipFileName);
    }
}

上面的代码生成了 3 个文件:file.zip, file.z01 and file.z02。 当我右键单击该 zip 文件并 select Extract All(不使用 WinRAR 或其他压缩软件提取,仅使用内置的 Windows zip)时,出现以下错误:

The same volume can not be used as both the source and destination

奇怪的是,它只发生在我第一次尝试提取文件时,后续的提取都可以,所以这一定是文件最初的压缩方式。

更新 1

即使我解压缩到不同的文件夹也会发生同样的事情

在 DotNetZip Codeplex 站点上已经讨论过此问题,但似乎问题尚未解决

http://dotnetzip.codeplex.com/discussions/239172

http://dotnetzip.codeplex.com/discussions/371005

更新 2

查看 MaxOutputSegmentSize 属性 的文档,它被引用:

I don't believe Windows Explorer can extract a split archive.

虽然没有进一步解释原因。我认为这是误报,因为如上所述,

it only happens on the first time I try to extract the files, the succeeding extractions are OK

我正在使用 Windows 8.1 64 位。

在搜索软件失败的原因时,您总是想做的第一件事就是找到错误消息的来源。您通过 using Google first. Second hit (right now) is golden, somebody 反编译了 Windows 个可执行文件并将此特定字符串作为资源 ID #10209 定位在名为 zipfldr.dll 的文件中并带有 Microsoft 版权通知。

非常匹配,zipfldr.dll 是 shell 命名空间扩展,Windows 使用它来显示 .zip 文件的内容,就好像它是一个文件夹一样。您可以在 Regedit.exe 中看到它,导航到 HKEY_CLASSES_ROOT\CLSID\ {E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31} 进行初级注册。 HKEY_CLASSES_ROOT\SystemFileAssociations\ .zip\CLSID 注册表项将其与 .zip 文件相关联。

所以你有一个确凿的事实,它确实是 Explorer 扩展失败了。当然,您对此无能为力。唯一的疑问是您使用的 Zip 库弄乱了跨区文件的内容,从而导致扩展失败。通过看到不止一个库触发此错误,这种情况会大大减少,Ionic 和 Dotnetzip 具有完全相同错误的几率相当低。不为零,程序员确实倾向于 "how did they do that" 浏览其他程序员的代码以获取灵感。这个错误是虚假的,这一事实给棺材钉上了钉子,你会认为糟糕的 zip 存档内容会反复触发错误。

可能能够对潜在问题进行逆向工程,您可以使用 SysInternals 的进程监视器来实现。您将看到资源管理器读取和写入文件。可能在 TEMP 目录中,如果 .zip 文件已存在于该目录中,我推测您会收到类似这样的错误。 TEMP 在大多数机器上是一个非常混乱的文件夹,太多的程序不能自行清理。包括 zip 库,一个没有其他证据支持的有吸引力的理论 :)

如果这没有成功,那么最终的退路就是微软。他们有一个 1-800 电话号码,您可以通过该号码获得有关他们产品问题的支持。我已经用了好几次了,他们总是能解决我的问题并退还预付费用。然而,这是一个 Windows 问题,一个拥有十亿用户的产品。充其量,您将得到一个解决方法,实际的软件修复是极不可能的。并非完全不可能,它已经做到了。但他们推荐的解决方法很有可能是 "use a 3rd party utility like Winzip"。不是你想听的。

请将 zip 文件移动到其他文件夹或尝试使用 7zip 解压文件。

  1. 下载 7zip 并安装。
  2. 将 zip 文件移动到其他位置。
  3. 然后,右键点击文件夹 -> select 7zip -> 解压到这里