【发布时间】:2021-09-03 00:27:12
【问题描述】:
我正在尝试编写代码以从 zip 存档中删除 _MAXOSX 文件夹(如果存在)(如果存在则进一步中断验证)。
代码必须返回 byte[] 而不是 ZipArchive 本身。我目前拥有的代码是:
var fileBytes = uploadController.FileBytes;
if (stripMacOSXFolder && uploadController.FileName.EndsWith(".zip", StringComparison.CurrentCultureIgnoreCase))
{
try
{
using (var data = new MemoryStream(fileBytes))
using (var archive = new ZipArchive(data, ZipArchiveMode.Update))
{
var osx = archive.Entries.SingleOrDefault(c =>
c.FullName.Equals("__MACOSX/", StringComparison.CurrentCultureIgnoreCase));
if (osx != null)
{
osx.Delete();
// SET fileBytes to archive byte[]
}
}
}
catch (Exception)
{
return new ObjectReturnMethodResult<UploadedFileV2>("Uploaded zip appears to be invalid.");
}
}
删除条目后,我不清楚如何将fileBytes 设置为更新后的 ZipArchive 的字节数组。
【问题讨论】:
-
Ata 猜测:
fileBytes = data.ToArray();我假设它会更新流。 -
@Llama 不幸的是在
osx.Delete();之后如果我添加fileBytes = data.ToArray();它似乎不起作用 - 该文件夹没有从存档中删除。 -
您是在
ZipArchive被处置后这样做的吗?如果你是在里面做的,那么它可能没有写入更改。 -
啊,docs 似乎支持这个理论:“当你将模式设置为更新时,底层文件或流必须支持读、写和查找。整个存档保存在内存中,并且在处理存档之前不会将数据写入基础文件或流。"
标签: c# arrays ziparchive