我们有上传 zip 文件的代码,在进程开始时,如果 zip 文件在 zip 中包含
__MACOSX
文件夹,它将从 zip 中删除这些文件夹/文件并传递文件字节。
我们遇到的问题是,如果我们使用
ZipArchive
创建一个新的 fileBytes
,我们会得到错误:
Number of entries expected in End Of Central Directory does not correspond to number of entries in Central Directory.
仅当 zip 不 包含任何要删除的
__MAXOSX
文件夹时,才会发生这种情况。注释掉以下代码可以防止此错误发生。
// Strip MacOSX folder if zip
var fileBytes = uploadController.FileBytes;
if (uploadController.FileName.EndsWith(".zip", StringComparison.CurrentCultureIgnoreCase))
{
try
{
using (var data = new MemoryStream(fileBytes))
{
var changed = false;
using (var archive = new ZipArchive(data, ZipArchiveMode.Update))
{
while (true)
{
var osx = archive.Entries.FirstOrDefault(
c => c.FullName.StartsWith("__MACOSX/", StringComparison.CurrentCultureIgnoreCase)
);
if (osx == null) break;
osx.Delete();
changed = true;
}
}
// Archive is updated once disposed
if (changed)
{
fileBytes = data.ToArray();
}
}
}
catch (Exception e)
{
return new ObjectReturnMethodResult<UploadedFileV2>("Uploaded zip appears to be invalid." + e.Message);
}
}
在不包含
__MACOSX
的 zip 上运行上述代码时,为什么会产生此错误?
改变:
using (var data = new MemoryStream(fileBytes))
致:
using (var data = new MemoryStream(fileBytes.ToArray()))
似乎解决了这个问题,虽然不知道为什么!