使用 System.IO.Packaging 生成 ZIP 文件

Posted

技术标签:

【中文标题】使用 System.IO.Packaging 生成 ZIP 文件【英文标题】:Using System.IO.Packaging to generate a ZIP file 【发布时间】:2011-06-17 13:01:24 【问题描述】:

我知道 DotNetZip 或 SharpZipLib 库之类的库通常推荐用于以 .net 语言(在我的情况下为 C#)创建 ZIP 文件,但使用 System.IO.Packaging 来创建 ZIP 文件并非不可能生成一个 ZIP 文件。我认为尝试在 C# 中开发一个可以做到这一点的例程可能会很好,而无需下载任何外部库。有没有人有一个或多个使用System.IO.Packaging 生成 ZIP 文件的方法的好例子?

【问题讨论】:

好吧,看了一会之后,看起来使用 System.IO.Packaging 的尴尬并不是人们像瘟疫一样避免它的唯一原因;它还在生成的每个 zip 中生成一个愚蠢的 [Content_Types].xml 文件,并且对于它与其他 zip 文件客户端的兼容性存在严重的问号。所以...我想我会使用 DotNetZip。 :-) 【参考方案1】:

让我帮你搜索一下 -> system.io.packaging+generate+zip

第一个链接 http://weblogs.asp.net/jongalloway//creating-zip-archives-in-net-without-an-external-library-like-sharpziplib

using System;
using System.IO;
using System.IO.Packaging;

namespace ZipSample

    class Program
    
        static void Main(string[] args)
        
            AddFileToZip("Output.zip", @"C:\Windows\Notepad.exe");
            AddFileToZip("Output.zip", @"C:\Windows\System32\Calc.exe");
        

        private static void AddFileToZip(string zipFilename, string fileToAdd, CompressionOption compression = CompressionOption.Normal)
        
            using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate))
            
                string destFilename = ".\\" + Path.GetFileName(fileToAdd);
                Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
                if (zip.PartExists(uri))
                
                    zip.DeletePart(uri);
                
                PackagePart part = zip.CreatePart(uri, "", compression);
                using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
                
                    using (Stream dest = part.GetStream())
                    
                        fileStream.CopyTo(dest);
                    
                
            
                      
    

【讨论】:

真的不能自己实现吗? :S 很好,谢谢。只想提一下,要使用此代码,您必须添加对 WindowsBase dll 的引用才能使用 System.IO.Packaging 具有讽刺意味的是,我用谷歌搜索了“创建 zip System.IO.Packaging”,它首先显示了这个线程。你把它弄坏了。 “让我为你搜索一下这个……” 哇,如果你尝试一下,你能不能更屈尊一点?这个答案的措辞只比LMGTFY link, which Stack Overflow frowns upon高一两步。 “让我为你搜索一下这个……”真的吗?请阅读这个 ! meta.stackexchange.com/questions/9953/…您的回答是正确的,谢谢,但是您的行为很糟糕-> 否决【参考方案2】:

在 .NET Framework 4.5 中,您可以使用 System.IO.Compression 命名空间中的新类。

【讨论】:

以上是关于使用 System.IO.Packaging 生成 ZIP 文件的主要内容,如果未能解决你的问题,请参考以下文章

从不可搜索的流中打开 System.IO.Packaging.Package

使用 System.IO.Packaging 在 c# 中解压缩 zip 文件

System.IO.Packaging无法使用,需引用WindowsBase.dll

使用 System.IO.Packaging 在 c# 中创建 zip

在 c# 中使用 System.IO.Packaging 对 .xlsx 文件进行数字签名

开放包装约定/ System.IO.Packaging 教程 [关闭]