相同的卷不能同时用作源和目标

jmc*_*jmc 33 c# dotnetzip

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码生成3个文件:file.zip, file.z01 and file.z02.当我右键单击该zip文件并选择Extract All(不使用WinRAR或其他压缩软件提取,只是内置的Windows zip)时,它会给我以下错误:

相同的卷不能同时用作源和目标

在此输入图像描述 在此输入图像描述

奇怪的是,它只发生在我第一次尝试提取文件时,后续的提取是正常的,所以它必须是文件首先被压缩的方式.

更新1

即使我提取到不同的文件夹,也会发生同样的事情

在DotNetZip Codeplex网站上已就此问题进行了讨论,但似乎问题尚未得到解决

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

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

更新2

查看MaxOutputSegmentSize属性的doc ,引用它:

我不相信Windows资源管理器可以提取拆分存档.

关于为什么,没有进一步的解释.我认为这是假阳性,因为如上所述,

它只在我第一次尝试提取文件时发生,后续提取都可以

我正在使用Windows 8.1 64位.

Han*_*ant 15

在搜索软件失败的原因时,您始终要做的第一件事就是找到错误消息的来源.你首先使用谷歌做到这一点.第二次访问(现在)是黄金,有人反编译了Windows可执行文件,并将此特定字符串作为资源ID#10209放在以zipfldr.dllMicrosoft版权通知命名的文件中.

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

所以你有一个事实,它真的是资源管理器扩展失败了.当然,你可以做的很少.只是仍然怀疑它可能是您使用的Zip库,它会使传播的文件内容摸索,从而导致扩展失败.通过看到多个库绊倒此错误,显着减少了这一点,Ionic和Dotnetzip具有完全相同的错误的几率相当低.不是零,程序员确实倾向于"他们是怎么做的"偷看其他程序员的代码以获得灵感.这个错误是虚假的这一事实将钉子钉在棺材中,你会期望糟糕的zip存档内容反复出错.

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

如果这还没有成功,那么最终的后备是微软.他们有一个1-800的电话号码,您可以在其中获得产品问题的支持.我已多次使用它,它们总能解决我的问题并退还前期费用.然而,这是一个Windows问题,一个拥有十亿用户的产品.您最多可以获得一种解决方法,实际的软件修复极不可能.并非完全不可能,已经完成了.但他们推荐的解决方法是"使用像Winzip这样的第三方实用程序"的可能性非常高.不是你想听到的.