覆盖ZipArchiveEntry

时间:2017-10-18 12:26:32

标签: c# zip streamwriter

如何覆盖ZipArchiveEntry的内容?如果新文件内容比原始文件内容短,则使用StreamWriterStringBuilder的代码失败,例如:

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的旧内容? 注意:我不想解压缩文件,我想更改存档的内容

3 个答案:

答案 0 :(得分:8)

替代方法是(kubectl get nodes: NAME STATUS ROLES AGE VERSION k8s.my.fqdn Ready <none> 29m v1.8.1) 流的kubelet

SetLength(document.Length)

答案 1 :(得分:4)

以下代码维护您的基本代码结构,但显式删除并重新创建文件以确保不会保留“剩余”数据。

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);
    }
}

答案 2 :(得分:2)

更新存档意味着您要么从存档中添加,移动或删除条目。

请考虑执行以下步骤。

  • 获取参赛内容

  • 从存档中删除条目(记下姓名/位置)

  • 根据需要修改内容。

  • 将修改后的内容添加回存档。