`

.NET中zip的压缩和解压

阅读更多
来源于:http://www.cnblogs.com/zhaozhan/archive/2012/05/28/2520701.html

在.NET可以通过多种方式实现zip的压缩和解压:1、使用System.IO.Packaging;2、使用第三方类库;3、通过 System.IO.Compression 命名空间中新增的ZipArchive、ZipFile等类实现。

     一、使用System.IO.Packaging压缩和解压

     Package为一个抽象类,可用于将对象组织到定义的物理格式的单个实体中,从而实现可移植性与高效访问。ZIP 文件是Package的主物理格式。 其他Package实现可以使用其他物理格式(如 XML 文档、数据库或 Web 服务。与文件系统类似,在分层组织的文件夹和文件中引用 Package 中包含的项。虽然 Package 是抽象类,但 Package.Open 方法默认使用 ZipPackage 派生类。

    System.IO.Packaging在WindowsBase.dll程序集下,使用时需要添加对WindowsBase的引用。

    1、将整个文件夹压缩成zip

Code/// <summary>
        /// Add a folder along with its subfolders to a Package
        /// </summary>
        /// <param name="folderName">The folder to add</param>
        /// <param name="compressedFileName">The package to create</param>
        /// <param name="overrideExisting">Override exsisitng files</param>
        /// <returns></returns>
        static bool PackageFolder(string folderName, string compressedFileName, bool overrideExisting)
        {
            if (folderName.EndsWith(@"\"))
                folderName = folderName.Remove(folderName.Length - 1);
            bool result = false;
            if (!Directory.Exists(folderName))
            {
                return result;
            }

            if (!overrideExisting && File.Exists(compressedFileName))
            {
                return result;
            }
            try
            {
                using (Package package = Package.Open(compressedFileName, FileMode.Create))
                {
                    var fileList = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories);
                    foreach (string fileName in fileList)
                    {
                      
                        //The path in the package is all of the subfolders after folderName
                        string pathInPackage;
                        pathInPackage = Path.GetDirectoryName(fileName).Replace(folderName, string.Empty) + "/" + Path.GetFileName(fileName);

                        Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(pathInPackage, UriKind.Relative));
                        PackagePart packagePartDocument = package.CreatePart(partUriDocument,"", CompressionOption.Maximum);
                        using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                        {
                            fileStream.CopyTo(packagePartDocument.GetStream());
                        }
                    }
                }
                result = true;
            }
            catch (Exception e)
            {
                throw new Exception("Error zipping folder " + folderName, e);
            }
          
            return result;
        }
      2、将单个文件添加到zip文件中

Code       /// <summary>
        /// Compress a file into a ZIP archive as the container store
        /// </summary>
        /// <param name="fileName">The file to compress</param>
        /// <param name="compressedFileName">The archive file</param>
        /// <param name="overrideExisting">override existing file</param>
        /// <returns></returns>
        static bool PackageFile(string fileName, string compressedFileName, bool overrideExisting)
        {
            bool result = false;

            if (!File.Exists(fileName))
            {
                return result;
            }

            if (!overrideExisting && File.Exists(compressedFileName))
            {
                return result;
            }

            try
            {
                Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(Path.GetFileName(fileName), UriKind.Relative));
              
                using (Package package = Package.Open(compressedFileName, FileMode.OpenOrCreate))
                {
                    if (package.PartExists(partUriDocument))
                    {
                        package.DeletePart(partUriDocument);
                    }

                    PackagePart packagePartDocument = package.CreatePart(partUriDocument, "", CompressionOption.Maximum);
                    using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                    {
                        fileStream.CopyTo(packagePartDocument.GetStream());
                    }
                }
                result = true;
            }
            catch (Exception e)
            {
                throw new Exception("Error zipping file " + fileName, e);
            }
           
            return result;
        }       3、zip文件解压

Code/// <summary>
        /// Extract a container Zip. NOTE: container must be created as Open Packaging Conventions (OPC) specification
        /// </summary>
        /// <param name="folderName">The folder to extract the package to</param>
        /// <param name="compressedFileName">The package file</param>
        /// <param name="overrideExisting">override existing files</param>
        /// <returns></returns>
        static bool UncompressFile(string folderName, string compressedFileName, bool overrideExisting)
        {
            bool result = false;
            try
            {
                if (!File.Exists(compressedFileName))
                {
                    return result;
                }

                DirectoryInfo directoryInfo = new DirectoryInfo(folderName);
                if (!directoryInfo.Exists)
                    directoryInfo.Create();

                using (Package package = Package.Open(compressedFileName, FileMode.Open, FileAccess.Read))
                {
                    foreach (PackagePart packagePart in package.GetParts())
                    {
                        ExtractPart(packagePart, folderName, overrideExisting);
                    }
                }

                result = true;
            }
            catch (Exception e)
            {
                throw new Exception("Error unzipping file " + compressedFileName, e);
            }
           
            return result;
        }

        static void ExtractPart(PackagePart packagePart, string targetDirectory, bool overrideExisting)
        {
            string stringPart = targetDirectory + HttpUtility.UrlDecode(packagePart.Uri.ToString()).Replace('\\', '/');

            if (!Directory.Exists(Path.GetDirectoryName(stringPart)))
                Directory.CreateDirectory(Path.GetDirectoryName(stringPart));

            if (!overrideExisting && File.Exists(stringPart))
                return;
            using (FileStream fileStream = new FileStream(stringPart, FileMode.Create))
            {
                packagePart.GetStream().CopyTo(fileStream);
            }
        }

      使用Package压缩文件会在zip文件自动生成[Content_Type].xml,用来描述zip文件解压支持的文件格式。

Code<?xml version="1.0" encoding="utf-8" ?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
    <Default Extension="vsixmanifest" ContentType="text/xml" />
    <Default Extension="dll" ContentType="application/octet-stream" />
    <Default Extension="png" ContentType="application/octet-stream" />
    <Default Extension="txt" ContentType="text/plain" />
    <Default Extension="pkgdef" ContentType="text/plain" />
</Types>       同样,如果zip文件不包含[Content_Type].xml文件,或者[Content_Type].xml文件不包含所对应扩展名的描述(手动添加的[Content_Type].xml也是可以),将无法解压文件。      二、使用第三方类库      zip的压缩和解压使用比较的有SharpZipLib和DotNetZip。

      1、SharpZipLib,也称为“#ziplib”,基于GPL开源,支持Zip,GZip,Tar和BZip2的压缩和解压缩。

      支持.NET 1.1,NET 2.0(3.5、4.0).

      (1)zip压缩

Codepublic static void Zip(string SrcFile, string DstFile, int BufferSize)
{
    FileStream fileStreamIn = new FileStream
(SrcFile, FileMode.Open, FileAccess.Read);
    FileStream fileStreamOut = new FileStream
(DstFile, FileMode.Create, FileAccess.Write);
    ZipOutputStream zipOutStream = new ZipOutputStream(fileStreamOut);
    byte[] buffer = new byte<buffersize />;
    ZipEntry entry = new ZipEntry(Path.GetFileName(SrcFile));
    zipOutStream.PutNextEntry(entry);
    int size;
    do
    {
        size = fileStreamIn.Read(buffer, 0, buffer.Length);
        zipOutStream.Write(buffer, 0, size);
    } while (size > 0);
    zipOutStream.Close();
    fileStreamOut.Close();
    fileStreamIn.Close();
}       (2)解压zipCodepublic static void UnZip(string SrcFile, string DstFile, int BufferSize)
{
    FileStream fileStreamIn = new FileStream
(SrcFile, FileMode.Open, FileAccess.Read);
    ZipInputStream zipInStream = new ZipInputStream(fileStreamIn);
    ZipEntry entry = zipInStream.GetNextEntry();
    FileStream fileStreamOut = new FileStream
(DstFile + @"\" + entry.Name, FileMode.Create, FileAccess.Write);
    int size;
    byte[] buffer = new byte<buffersize />;
    do
    {
        size = zipInStream.Read(buffer, 0, buffer.Length);
        fileStreamOut.Write(buffer, 0, size);
    } while (size > 0);
    zipInStream.Close();
    fileStreamOut.Close();
    fileStreamIn.Close();
}      2、DotNetLib,是基于”WS-PL”开源,使用比较简单     (1)压缩Codeusing (ZipFile zip = new ZipFile())
  {
    zip.AddFile("ReadMe.txt");
    zip.AddFile("7440-N49th.png");
    zip.AddFile("2008_Annual_Report.pdf");       
    zip.Save("Archive.zip");
  }     (2)解压Codeprivate void MyExtract()
  {
      string zipToUnpack = "C1P3SML.zip";
      string unpackDirectory = "Extracted Files";
      using (ZipFile zip1 = ZipFile.Read(zipToUnpack))
      {
          // here, we extract every entry, but we could extract conditionally
          // based on entry name, size, date, checkbox status, etc. 
          foreach (ZipEntry e in zip1)
          {
            e.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently);
          }
       }
    }



    三、在.NET 4.5使用ZipArchive、ZipFile等类压缩和解压

Code        static void Main(string[] args)
        {
            string ZipPath = @"c:\users\exampleuser\start.zip";
            string ExtractPath = @"c:\users\exampleuser\extract";
            string NewFile = @"c:\users\exampleuser\NewFile.txt";

            using (ZipArchive Archive = ZipFile.Open(ZipPath, ZipArchiveMode.Update))
            {
                Archive.CreateEntryFromFile(NewFile, "NewEntry.txt");
                Archive.ExtractToDirectory(ExtractPath);
            }
        }
分享到:
评论

相关推荐

    VB.NET编写的压缩与解压函数

    ### VB.NET中的压缩与解压技术 #### 一、简介 VB.NET(Visual Basic .NET)是一种广泛使用的面向对象编程语言,它是Microsoft .NET框架的一部分,用于创建Windows桌面应用程序和其他类型的软件。在许多应用场景中,...

    VB.NET使用ZipPackage实现ZIP文件压缩解压缩示例

    在.NET框架中,VB.NET提供了一种方便的方式来处理ZIP文件的压缩和解压缩,这主要得益于System.IO.Packaging命名空间中的ZipPackage类。本文将深入探讨如何利用VB.NET和ZipPackage来完成这一任务,同时也会提及一些...

    .NET Framework 4.5 ZipArchive类压缩解压

    .NET Framework 4.5 中的 ZipArchive 类是一个非常实用的工具,它允许开发者方便地对文件进行压缩和解压操作。在 ASP.NET 开发中,这个功能尤其有用,因为经常需要处理用户上传或下载的文件。ZipArchive 类的引入...

    Asp.net2.0实现压缩/解压示例源码

    通过这个Asp.NET 2.0的压缩/解压示例源码,开发者可以学习到如何在实际项目中集成这些功能,提高应用程序的效率和用户体验。不过,随着技术的发展,更现代的框架如ASP.NET Core已经提供了更简洁的API来处理这些任务...

    .net zip压缩解压动态库源码

    综上所述,`.NET zip压缩解压动态库源码`是为C#开发者设计的一个高效、简洁的工具,它封装了处理ZIP文件的核心操作,使得在C#项目中实现压缩和解压缩功能变得更加便捷。通过理解和应用这些知识点,开发者能够轻松地...

    C# .net解压缩程序 压缩 解压

    使用C#进行ZIP压缩的基本步骤如下: 1. 引入`System.IO.Compression`命名空间: ```csharp using System.IO; using System.IO.Compression; ``` 2. 创建一个ZipArchive对象,打开一个新或现有的ZIP文件: ```...

    .net 解压与压缩 .net2.0

    这个库不仅提供了基本的压缩和解压缩功能,还包括创建和修改ZIP档案、读取和写入GZip和BZip2流、以及处理7-Zip和Tar档案的高级功能。 在.NET 2.0中使用SharpZipLib进行文件压缩,首先需要将`ICSharpCode....

    .net ZIP压缩类

    本文将详细探讨.NET中的ZIP压缩类,包括如何使用它们进行文件的压缩和解压,以及可能的优化策略。 首先,我们关注的核心类是`System.IO.Compression.ZipArchive`。这个类提供了创建、打开和修改ZIP档案的功能。在`...

    VB.net开发文件压缩解压缩实例

    在VB.NET编程环境中,开发文件压缩和解压缩功能可以极大地提升数据存储和传输的效率。ICSharpCode.SharpZipLib库是一个强大的开源组件,它提供了对多种压缩格式的支持,包括ZIP和GZip等。本实例将详细介绍如何使用VB...

    vb.net 利用.net自带的GZipStream压缩或者解压文件的代码,不需要任何第三方控件

    网上很少有用VB写的压缩文件的代码,但是,在网络...另外加上了多层文件夹压缩解压。但是,因为时间有限,只是将文件全部读取到缓存处理,所以,针对大文件没有做特别的处理。例子里面有提示,根据需要自己改动一下吧。

    Asp.net2.0在线压缩_解压示例源码

    在这个“Asp.net2.0在线压缩_解压示例源码”中,我们可以看到如何在ASP.NET环境中实现文件的在线压缩和解压功能。这个示例提供了对用户上传的文件进行压缩或解压缩的功能,这对于处理大量数据的Web应用尤其有用,...

    fido.zip_asp.net_zip

    标签 "asp.NET zip" 指出这个主题涉及如何在ASP.NET应用中使用ZIP压缩技术。在ASP.NET中,可以使用多种方式来处理ZIP文件,例如使用第三方库如SharpZipLib或System.IO.Compression namespace(自.NET Framework 4.5...

    .net 压缩和解压组件DLL

    总的来说,.NET中的7-Zip组件DLL(7z-64.dll和SevenZipSharp.dll)为开发者提供了强大的压缩和解压缩功能,使得在.NET环境中处理压缩文件变得易如反掌。无论是简单的单文件操作还是复杂的压缩任务,都可以借助这些...

    VC++.net 压缩和解压大文件示例代码

    在VC++.net环境中,处理大文件的压缩...总的来说,VC++.net中处理大文件的压缩和解压涉及了对压缩库的熟练运用,理解文件流操作,以及可能的性能优化策略。通过Zlib、7-Zip SDK等工具,开发者可以高效地完成这项任务。

    Android端zip压缩与解压.zip

    Android端zip压缩与解压,目前暂时只做zip格式支持,基于Zip4j (http://www.lingala.net/zip4j/)进行扩展成工具类,支持对单个文件,多个文件以及文件夹进行压缩,对压缩文件解压到到指定目录,支持压缩解压使用密码...

    .net (c#) ZIP压缩1.0版支持.net1.1

    `.NET (C#) ZIP压缩1.0版支持.NET1.1`是一个专为.NET 1.1框架设计的库,旨在帮助开发者在C#环境中方便地实现ZIP文件的压缩与解压功能。这个版本已经考虑了设计的易用性和稳定性,并修复了一些已知的错误,使得开发...

    Asp.net 压缩和解压文件

    asp.net 压缩解压文件,调用该方法,直接传入路径参数即可,非常好用,本人推荐哦

    基于ASP.NET2.0的在线压缩-解压源程序代码

    在本文中,我们将深入探讨如何使用ASP.NET 2.0框架来实现在线的文件压缩和解压功能。ASP.NET 2.0是Microsoft .NET Framework的一部分,它为Web应用程序开发提供了一个强大的平台。通过结合C#编程语言和Visual Studio...

    c#zip压缩与解压

    在.NET框架中,C#程序员可以使用不同的库来实现ZIP文件的压缩与解压功能。本文将详细探讨C#中如何进行ZIP文件的操作,并重点介绍`System.IO.Compression`命名空间下的`ZipFile`类以及第三方库ICSharpCode....

    asp.net zip处理

    这篇文章将深入探讨如何在ASP.NET中有效地处理zip文件,包括上传、解压并保持目录结构。 首先,我们需要理解ASP.NET中的文件上传机制。在ASP.NET中,用户通过表单上传文件时,这些文件会被封装在HttpRequest对象的...

Global site tag (gtag.js) - Google Analytics