zoukankan      html  css  js  c++  java
  • 浅谈 ZipArchive 类

    Microsoft .NET Framework 4.5 新增了 ZipArchive 类

    Microsoft Windows 8 Consumer Preview 操作系统已经内置了 Microsoft .NET Framework 4.5,它新增了对 Zip 文件的支持。这是通过 System.IO.Compression 命名空间中新增的 ZipArchive、ZipFile 等类实现的。注意,Microsoft .NET Framework 2.0 中已经有的 GZipStream、DeflateStream 类仅仅能处理单一的 Zip 流。不支持包括多个文件的 Zip 压缩包。

    创建 Zip 压缩包

    创建 Zip 压缩包很easy。例如以下 ZipCreater.cs 所看到的:

    复制代码
     1 using System;
     2 using System.IO.Compression;
     3 
     4 namespace Skyiv.Tester
     5 {
     6   sealed class ZipCreater
     7   {
     8     static void Main()
     9     {
    10       using (var zip = ZipFile.Open("ZipCreater.zip", ZipArchiveMode.Create))
    11       {
    12         zip.CreateEntryFromFile(@"C:workipCreater.cs", "ZipCreater.cs");
    13         zip.CreateEntryFromFile("ZipCreater.exe", "ZipCreater.exe");
    14       }
    15     }
    16   }
    17 }
    复制代码

    上述程序中。ZipFile 类的 Open 方法返回 类型为 ZipArchive 的变量 zip,然后调用 ZipArchvie 类的扩展方法 CreateEntryFromFile 来把文件增加到 Zip 压缩包中,该扩展方法在 ZipFileExtensions 类中定义。

    在 Microsoft Windows 8 Consumer Preview 操作系统中编译和执行:

    C:work> C:WindowsMicrosoft.NETFrameworkv4.0.30319csc ZipCreater.cs -r:System.IO.Compression.dll -r:System.IO.Compression.FileSystem.dll
    Microsoft (R) Visual C# Compiler version 4.0.30319.17379
    for Microsoft (R) .NET Framework 4.5
    版权全部 (C) Microsoft Corporation。

    保留全部权利。 C:work> ZipCreater

    该程序的执行结果是生成一个例如以下所看到的的 Zip 压缩包 ZipCreater.zip:

    ZipFile

    将压缩包解压到指定文件夹

    我们来看看 Unzip.cs:

    复制代码
     1 using System;
     2 using System.IO.Compression;
     3 
     4 namespace Skyiv.Utils
     5 {
     6   sealed class Unzip
     7   {
     8     static void Main(string[] args)
     9     {
    10       if (args.Length != 2)
    11       {
    12         Console.WriteLine("Usage: Unzip zip-file-name directory-name");
    13         return;
    14       }
    15       try { ZipFile.ExtractToDirectory(args[0], args[1]); }
    16       catch (Exception ex) { Console.Error.WriteLine(ex.Message); }
    17     }
    18   }
    19 }
    复制代码

    上述程序的核心内容是第 15 行使用 ZipFile 类的静态方法 ExtractToDirectory 把压缩包中的全部文件解压到指定文件夹。编译和执行的结果例如以下所看到的:

    C:work> C:WindowsMicrosoft.NETFrameworkv4.0.30319csc Unzip.cs -r:System.IO.Compression.FileSystem.dll
    Microsoft (R) Visual C# Compiler version 4.0.30319.17379
    for Microsoft (R) .NET Framework 4.5
    版权全部 (C) Microsoft Corporation。保留全部权利。
    
    C:work> Unzip ZipCreater.zip ZipCreater
    

    将指定文件夹中的全部文件打包到压缩包中

    再看看以下的 Zip.cs:

    复制代码
     1 using System;
     2 using System.IO.Compression;
     3 
     4 namespace Skyiv.Utils
     5 {
     6   sealed class Zip
     7   {
     8     static void Main(string[] args)
     9     {
    10       if (args.Length != 2)
    11       {
    12         Console.WriteLine("Usage: Zip zip-file-name directory-name");
    13         return;
    14       }
    15       try { ZipFile.CreateFromDirectory(args[1], args[0]); }
    16       catch (Exception ex) { Console.Error.WriteLine(ex.Message); }
    17     }
    18   }
    19 }
    复制代码

    上述程序的核内容是第 15 行使用 ZipFile 类的静态方法 CreateFromDirectory 把指定文件夹中的全部文件打包成一个压缩包。编译和执行的结果例如以下所看到的:

    C:work> C:WindowsMicrosoft.NETFrameworkv4.0.30319csc Zip.cs -r:System.IO.Compression.FileSystem.dll
    Microsoft (R) Visual C# Compiler version 4.0.30319.17379
    for Microsoft (R) .NET Framework 4.5
    版权全部 (C) Microsoft Corporation。

    保留全部权利。

    C:work> Zip ZipCreater.2.zip ZipCreater

    直接读取网络上的压缩包的内容

    我把前面生成的 ZipCreater.zip 文件上传到博客园,然后写一个程序直接从博客园的server上读取该压缩包中的 ZipCreater.cs 文件的内容显示在屏幕上:

    复制代码
     1 using System;
     2 using System.IO;
     3 using System.IO.Compression;
     4 using System.Net;
     5 
     6 namespace Skyiv.Test
     7 {
     8   static class ZipTester
     9   {
    10     static void Main()
    11     {
    12       using (var zip = new ZipArchive(new Uri(
    13         "http://files.cnblogs.com/skyivben/ZipCreater.zip").GetHttpStream()))
    14         zip.GetEntry("ZipCreater.cs").Open().CopyTo(Console.OpenStandardOutput());
    15     }
    16     
    17     static Stream GetHttpStream(this Uri uri)
    18     {
    19       return ((HttpWebResponse)((HttpWebRequest)WebRequest.Create(uri)).GetResponse()).GetResponseStream();
    20     }
    21   }
    22 }
    复制代码

    上述程序中:

    • 第 13 行通过调用在第 17 到 20 行定义的 GetHttpStream 扩展方法得到一个网络流,然后使用该网络流来构造一个 ZipArchive 类。
    • 第 14 行调用 ZipArchive 类的 GetEntry 方法得到一个 ZipArchiveEntry 类,然后调用 ZipArchiveEntry 类的 Open 方法就得到所须要的 Stream 类,直接调用Stream 类的 CopyTo 方法写入标准输出。

    这个程序的执行结果例如以下所看到的:

    ZipTester

    查看全文

  • 相关阅读:
    nodejs 的序列化与反序列化
    Visual Studio 监视与快速监视即时窗口没有智能提示
    mysql 备份数据语句
    mysql 导入sql 2006
    MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts.
    怎么查看mysql的安装目录
    【支付宝】退款接口 报 “缺少签名参数”
    【支付宝】"验签出错,sign值与sign_type参数指定的签名类型不一致:sign_type参数值为RSA,您实际用的签名类型可能是RSA2"
    【支付宝】支付 系统繁忙,请稍后再试(ALIN10146)
    php插入日志到数据库,对象转json
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7170008.html
Copyright © 2011-2022 走看看