是否可以直接在zip文件中更改文件内容?

时间:2013-02-03 10:34:32

标签: c# .net zip dotnetzip

我的表单带有文本框,客户希望将此文本框中的所有更改存储到zip存档。

我正在使用http://dotnetzip.codeplex.com 我有代码示例:

 using (ZipFile zip = new ZipFile())
  {
    zip.AddFile("text.txt");    
    zip.Save("Backup.zip");
  }

我不想每次都创建temp text.txt并将其压缩回来。 我可以在zip文件中访问text.txt作为Stream并在那里保存文本吗?

2 个答案:

答案 0 :(得分:1)

DotNetZip中有一个示例,它使用方法AddEntry的Stream。

String zipToCreate = "Content.zip";
String fileNameInArchive = "Content-From-Stream.bin";
using (System.IO.Stream streamToRead = MyStreamOpener())
{
  using (ZipFile zip = new ZipFile())
  {
    ZipEntry entry= zip.AddEntry(fileNameInArchive, streamToRead);
    zip.Save(zipToCreate);  // the stream is read implicitly here
  }
}

使用LinqPad进行一点测试表明可以使用MemoryStream构建zip文件

void Main()
{
    UnicodeEncoding uniEncoding = new UnicodeEncoding();
    byte[] firstString = uniEncoding.GetBytes("This is the current contents of your TextBox");
    using(MemoryStream memStream = new MemoryStream(100))
    {
        memStream.Write(firstString, 0 , firstString.Length);
        // Reposition the stream at the beginning (otherwise an empty file will be created in the zip archive
        memStream.Seek(0, SeekOrigin.Begin);
        using (ZipFile zip = new ZipFile())
        {
            ZipEntry entry= zip.AddEntry("TextBoxData.txt", memStream);
            zip.Save(@"D:\temp\memzip.zip");  
        }
     }
}

答案 1 :(得分:0)

我发现了其他可以将字符串作为参数的方法:

   zip.RemoveEntry(entry);
   zip.AddEntry(entry.FileName, text, ASCIIEncoding.Unicode);

如果条目已经存在,我们可以先删除它。