使用Zip存档创建C#压缩文件 System.IO.Compression

4

这里是我想要实现的功能:

  • 编写一个JSON文件。
  • 编写一个PDF文件。
  • 为这两个文件创建一个归档文件。

我使用 ZipArchive 的 System.IO.Compression 功能来实现这一点。从文档中,我没有找到一个很好的用例。文档中的示例假定zip文件已经存在。

我想要做的事情:创建 zipArchive 流,将 JSON 文件和 PDF 文件作为条目写入 zip 文件。

using (var stream = new FileStream(path, FileMode.Create))
{
   using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
   {
     ZipArchiveEntry manifest = archive.CreateEntry(filenameManifest);

     using (StreamWriter writerManifest = new StreamWriter(manifest.Open()))
     {
       writerManifest.WriteLine(JSONObject_String);
     }

     ZipArchiveEntry pdfFile = archive.CreateEntry(filenameManifest);
     using (StreamWriter writerPDF = new StreamWriter(pdfFile.Open()))
     {
       writerPDF.WriteLine(pdf);
     }
   }
 }

1
我认为你使用基于流的方法而不是基于现有文件的方法是正确的。顺便说一下,我建议不要使用StreamWriters,因为它们更适用于文本文件,而应该使用Stream.CopyTo方法直接复制二进制数据。https://learn.microsoft.com/en-us/dotnet/api/system.io.stream.copyto?view=netframework-4.7.2#System_IO_Stream_CopyTo_System_IO_Stream_ - Alice
1个回答

7
您没有关闭stream,而是使用'manifest.Open()'打开。这样可能没有将所有内容写入zip文件中。
请像下面这样在另一个using语句中包装它:
using (var stream = new FileStream(path, FileMode.Create))
{
   using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
   {
     ZipArchiveEntry manifest = archive.CreateEntry(filenameManifest);
     using (Stream st = manifest.Open())
     {
         using (StreamWriter writerManifest = new StreamWriter(st))
         {
            writerManifest.WriteLine(JSONObject_String);
         }
     }

     ZipArchiveEntry pdfFile = archive.CreateEntry(filenameManifest);
     using (Stream st = manifest.Open())
     {
         using (StreamWriter writerPDF = new StreamWriter(st))
         {
            writerPDF.WriteLine(pdf);
         }
     }
   }
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接