.net 可能的错误在ZipArchive与存档模式更新?

slwdgvem  于 2023-03-20  发布在  .NET
关注(0)|答案(2)|浏览(117)

如果zip文件包含“目录条目”,我遇到了ZipArchiveMode.Update的问题。
我知道没有目录条目这样的东西,但是有些工具会为zip文件中的目录生成ZipArchiveEntry.Length = 0ZipArchiveEntry.Name = ""条目。
下面的代码现在会损坏zip文件:

using (ZipArchive archive = ZipFile.Open(@"D:\TEMP\test.zip", ZipArchiveMode.Update))
{
}

正如您所看到的,除了用ZipArchiveMode.Update打开zip文件并在最后处理它之外,我什么也不做。
问题是“目录条目”似乎被视为文件条目。因此在输出中有新的零字节条目与目录名称。
我仍然可以打开zip文件,甚至每次拖放都可以提取文件。但是尝试提取zip文件会导致错误消息。可能是因为有两个条目具有相同的全名?
我的解决方法是避免使用ZipArchiveMode.Update,使用临时的MemoryStream,然后迭代所有条目,忽略“目录条目”,只将文件条目复制到流中,这样就可以了。
这是ZipArchive中的一个bug还是目录条目不正确?如果我想在zip中存储空目录怎么办?正如我所说:许多工具似乎都能产生这样的目录条目。

cl25kdpy

cl25kdpy1#

我得到了同样的问题时,试图更新一个zip文件与目录条目,更新后的文件zip文件存在(与新添加的文件),但其损坏。
最后,我成功地将Nuget引用添加到DotNetZip,并使用Ionic.Zip添加文件:

using (Ionic.Zip.ZipFile zip = Ionic.Zip.ZipFile.Read(parameters.ObjzfPath)) 
{
    zip.AddEntry("newFileEntry", "newFileContent"); // you can use zip.AddFile("newFile.txt") as well
    zip.Save();
}
nnsrf1az

nnsrf1az2#

在powershell脚本中,我遇到了一个带有更新模式的压缩存档和System.IO.Compressation.ZipFile的问题

Compress-Archive -Path C:\OtherStuff\*.txt -Update -DestinationPath archive.zip

# set an alias for 7zip
set-alias sz "C:\Program Files\7-Zip\7z.exe"
$zip =  [System.IO.Compression.ZipFile]::Open($zipfileName,"Update")
$zip.Dispose()

只要我在更新模式下打开zip,它就会立即损坏。我的解决方案是使用7zip。

# unzip to temp folder from ziplocation
sz x -o"$tempFolder" $zip_location -r ;

#edit file as wished

# remove the original zip
rm -fo $zip_location
# zip the folder with /* wilcard at the end to select only the contents     
sz a -tzip "$zip_location" "$tempFolderWild"
# remove the temp folder
rm -fo -r $tempFolder

相关问题