我正在使用以下代码创建拆分档案:
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文件并选择Extract All
(不使用WinRAR或其他压缩软件提取,只是内置的Windows zip)时,它会给我以下错误:
同一卷不能同时用作源和目的地
奇怪的是,它只在我第一次尝试提取文件时发生,后续提取是正常的,所以它必须是文件首先被压缩的方式。
更新1
即使我提取到另一个文件夹
,也会发生同样的事情在DotNetZip Codeplex网站上有关于这个问题的讨论,但似乎问题尚未解决
http://dotnetzip.codeplex.com/discussions/239172
http://dotnetzip.codeplex.com/discussions/371005
更新2
查看MaxOutputSegmentSize属性的文档,引用它:
我不相信Windows资源管理器可以提取拆分存档。
关于为什么,没有进一步的解释。我认为这是假阳性,因为如上所述,
它只在我第一次尝试提取文件时发生 接下来的提取是好的
我正在使用Windows 8.1 64位。
答案 0 :(得分:14)
在搜索软件失败的原因时,您始终要做的第一件事就是找到错误消息的来源。你可以通过using Google first来做到这一点。第二次访问(现在)是黄金,somebody已反编译Windows可执行文件,并将此特定字符串作为资源ID#10209放在名为zipfldr.dll
的文件中,并附带Microsoft版权声明。
这是一个很好的匹配,zipfldr.dll是Windows用于显示.zip文件内容的shell命名空间扩展,就像它是一个文件夹一样。您可以在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这样的第三方实用程序”的可能性非常高。不是你想听到的。
答案 1 :(得分:0)
请将该zip文件移动到其他文件夹,或尝试使用7zip提取文件。