使用带有dotnetzip的updateEntry()方法无法正确覆盖文件
本文关键字:方法 文件 覆盖 dotnetzip updateEntry | 更新日期: 2023-09-27 18:03:22
我最近遇到了一点问题。我一直试图将一个zip文件提取到内存流中,然后从该流中,使用updateEntry()
方法将其添加到目标zip文件。
问题是,当流中的文件被放入目标zip时,如果文件还没有在zip中,它就会工作。如果存在同名的文件,则不会正确覆盖。它在dotnetzip文档上说,这种方法将覆盖zip中存在的同名文件,但它似乎不起作用。它会正确写入,但当我去检查zip文件时,应该被覆盖的文件的压缩字节大小为0,这意味着出错了。
我把我的代码附在下面,向你展示我在做什么:
ZipFile zipnew = new ZipFile(forgeFile);
ZipFile zipold = new ZipFile(zFile);
using(zipnew) {
foreach(ZipEntry zenew in zipnew) {
percent = (current / zipnew.Count) * 100;
string flna = zenew.FileName;
var fstream = new MemoryStream();
zenew.Extract(fstream);
fstream.Seek(0, SeekOrigin.Begin);
using(zipold) {
var zn = zipold.UpdateEntry(flna, fstream);
zipold.Save();
fstream.Dispose();
}
current++;
}
zipnew.Dispose();
}
虽然它可能有点慢,但我通过手动删除和添加文件找到了一个解决方案。我将把代码留在这里,以防其他人遇到这个问题。
ZipFile zipnew = new ZipFile(forgeFile);
ZipFile zipold = new ZipFile(zFile);
using(zipnew) {
// Loop through each entry in the zip file
foreach(ZipEntry zenew in zipnew) {
string flna = zenew.FileName;
// Create a new memory stream for extracted files
var ms = new MemoryStream();
// Extract entry into the memory stream
zenew.Extract(ms);
ms.Seek(0, SeekOrigin.Begin); // Rewind the memory stream
using(zipold) {
// Remove existing entry first
try {
zipold.RemoveEntry(flna);
zipold.Save();
}
catch (System.Exception ex) {} // Ignore if there is nothing found
// Add in the new entry
var zn = zipold.AddEntry(flna, ms);
zipold.Save(); // Save the zip file with the newly added file
ms.Dispose(); // Dispose of the stream so resources are released
}
}
zipnew.Dispose(); // Close the zip file
}