3

我最近有点问题。我一直在尝试将一个 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();
}
4

1 回答 1

4

虽然可能有点慢,但我通过手动删除和添加文件找到了解决方案。我会把代码留在这里,以防其他人遇到这个问题。

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
}
于 2013-03-17T14:59:08.940 回答