覆盖 ZipArchiveEntry 的内容
Overwrite contents of ZipArchiveEntry
如何覆盖 ZipArchiveEntry
的内容?如果新文件内容比原始文件内容短,则以下使用 StreamWriter
和 StringBuilder
的代码将失败,例如:
using System.IO.Compression;
//...
using (var archive = ZipFile.Open("Test.zip", ZipArchiveMode.Update))
{
StringBuilder document;
var entry = archive.GetEntry("foo.txt");//entry contents "foobar123"
using (StreamReader reader = new StreamReader(entry.Open()))
{
document = new StringBuilder(reader.ReadToEnd());
}
document.Replace("foobar", "baz"); //builder contents "baz123"
using (StreamWriter writer = new StreamWriter(entry.Open()))
{
writer.Write(document); //entry contents "baz123123", expected "baz123"
}
}
生成的文件包含新旧内容混合 "baz123123" 而不是预期的 "baz123"。
有没有办法在写入新内容之前丢弃 ZipArchiveEntry
的旧内容?
注意:我不想提取文件,我想更改存档的内容。
更新存档意味着您要从存档中添加、移动或删除条目。
考虑执行以下步骤。
获取词条内容
从存档中删除条目(记下 name/location)
根据需要修改内容。
将修改后的内容添加回存档。
另一种方法是 entry.Open()
流的 SetLength(document.Length)
。
using(var stream = entry.Open())
{
stream.SetLength(document.Length);
using (StreamWriter writer = new StreamWriter(stream))
{
writer.Write(document); //entry contents "baz123"
}
}
以下代码保持您的基本代码结构,但明确删除并重新创建文件以确保 'leftover' 数据不会保留。
using (var archive = ZipFile.Open("Test.zip", ZipArchiveMode.Update))
{
StringBuilder document;
var entry = archive.GetEntry("foo.txt");//entry contents "foobar123"
using (StreamReader reader = new StreamReader(entry.Open()))
{
document = new StringBuilder(reader.ReadToEnd());
}
entry.Delete();
entry = archive.CreateEntry("foo.txt");
document.Replace("foobar", "baz"); //builder contents "baz123"
using (StreamWriter writer = new StreamWriter(entry.Open()))
{
writer.Write(document);
}
}
如何覆盖 ZipArchiveEntry
的内容?如果新文件内容比原始文件内容短,则以下使用 StreamWriter
和 StringBuilder
的代码将失败,例如:
using System.IO.Compression;
//...
using (var archive = ZipFile.Open("Test.zip", ZipArchiveMode.Update))
{
StringBuilder document;
var entry = archive.GetEntry("foo.txt");//entry contents "foobar123"
using (StreamReader reader = new StreamReader(entry.Open()))
{
document = new StringBuilder(reader.ReadToEnd());
}
document.Replace("foobar", "baz"); //builder contents "baz123"
using (StreamWriter writer = new StreamWriter(entry.Open()))
{
writer.Write(document); //entry contents "baz123123", expected "baz123"
}
}
生成的文件包含新旧内容混合 "baz123123" 而不是预期的 "baz123"。
有没有办法在写入新内容之前丢弃 ZipArchiveEntry
的旧内容?
注意:我不想提取文件,我想更改存档的内容。
更新存档意味着您要从存档中添加、移动或删除条目。
考虑执行以下步骤。
获取词条内容
从存档中删除条目(记下 name/location)
根据需要修改内容。
将修改后的内容添加回存档。
另一种方法是 entry.Open()
流的 SetLength(document.Length)
。
using(var stream = entry.Open())
{
stream.SetLength(document.Length);
using (StreamWriter writer = new StreamWriter(stream))
{
writer.Write(document); //entry contents "baz123"
}
}
以下代码保持您的基本代码结构,但明确删除并重新创建文件以确保 'leftover' 数据不会保留。
using (var archive = ZipFile.Open("Test.zip", ZipArchiveMode.Update))
{
StringBuilder document;
var entry = archive.GetEntry("foo.txt");//entry contents "foobar123"
using (StreamReader reader = new StreamReader(entry.Open()))
{
document = new StringBuilder(reader.ReadToEnd());
}
entry.Delete();
entry = archive.CreateEntry("foo.txt");
document.Replace("foobar", "baz"); //builder contents "baz123"
using (StreamWriter writer = new StreamWriter(entry.Open()))
{
writer.Write(document);
}
}