c# - 覆盖 ZipArchiveEntry 的内容

标签 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 的旧内容?
注意:我不想提取文件,我想更改存档的内容

最佳答案

另一种方法是 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"
   }
}

关于c# - 覆盖 ZipArchiveEntry 的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46810169/

相关文章:

c# - 在整个应用程序中使用用户 ID 的方法是什么?

performance - 打包大量文件以便将它们快速部署到 Azure 上的好方法是什么?

c# - StreamWriter 在 WriteLine 中间停止

c# - 如何唤醒 C# 中休眠的线程?

c# - 如何为自包含控制台应用程序 Visual Studio C# 创建 .msi 安装程序

java - 在 Java 中从 PHP readfile() 下载一个 zip 文件

c# - Stringbuilder 到 CSV

vb.net - DataGridView 转 CSV 文件

c# - 在 HTTPS 上设置站点后,不允许子操作执行重定向操作

python - Winzip 无法在 Windows 上打开由 python shutdown.make_archive 创建的存档。在 ubuntu 上存档管理器运行良好