中央目录末尾中预期的条目数与中央目录中的条目数不对应

问题描述 投票:0回答:1

我们有上传 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 上运行上述代码时,为什么会产生此错误?

c# asp.net c#-ziparchive
1个回答
0
投票

改变:

using (var data = new MemoryStream(fileBytes))

致:

using (var data = new MemoryStream(fileBytes.ToArray()))

似乎解决了这个问题,虽然不知道为什么!

© www.soinside.com 2019 - 2024. All rights reserved.