【发布时间】:2015-09-23 07:54:53
【问题描述】:
我在我的应用程序中使用DotNetZip 1.9.6,它使用类似于例如*.docx:包含 XML 文件的 Zip 文件。
现在,应用程序的每个模块都可以将此类 XML 文件存储到我的自定义文件管理中,并在“保存”时将它们序列化为流,然后通过 DotNetZip 将其保存到 Zip 文件中。
要更新我使用ZipFile.UpdateEntry(path, stream) 的条目。
这很好用,我第一次通过调用ZipFile.Save() 保存文件时一切正常。
但是,如果我在同一实例上第二次执行此操作(首先是一些 UpdateEntrycalls,然后是 Save),则 Zip 文件已损坏:文件结构和元数据(例如每个文件的未压缩大小)仍然存在在那里,但所有文件的压缩大小都是 0 字节。
如果我在保存一切正常后从刚刚保存的文件创建一个新实例,但是否可以避免这种情况并“重用”同一个实例?
以下示例(另见https://dotnetfiddle.net/mHxEIy)可用于重现该问题:
using System.IO;
using System.Text;
public class Program
{
public static void Main()
{
var zipFile = new Ionic.Zip.ZipFile();
var content1 = new MemoryStream(Encoding.Default.GetBytes("Content 1"));
zipFile.UpdateEntry("test.txt", content1);
zipFile.Save("test.zip"); // here the Zip file is correct
//zipFile = new Ionic.Zip.ZipFile("test.zip"); // uncomment and it works too
var content2 = new MemoryStream(Encoding.Default.GetBytes("Content 2"));
zipFile.UpdateEntry("test.txt", content2);
zipFile.Save(); // after that it is corrupt
}
}
要运行它,您需要添加“DotNetZip 1.9.6”NuGet 包。
【问题讨论】:
-
好多了,谢谢 - 是的,让我们删除 cmets...