• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > asp.NET中实现文件的压缩和解压(3种方式)

asp.NET中实现文件的压缩和解压(3种方式)

作者:Asharp 字体:[增加 减小] 来源:互联网 时间:2017-05-11

Asharp通过本文主要向大家介绍了文件下载 asp.net,文件上传 asp.net,多文件上传 asp.net,asp.net,asp net培训等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

在.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

 /// <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;
  }

</div>

2、将单个文件添加到zip文件中

 /// <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;
  }

</div>

3、zip文件解压

/// <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);
   }
  }

</div>

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

  <?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>
</div>

同样,如果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压缩

 public 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 >



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • asp.net实现多个文件同时下载功能
  • asp.net实现服务器文件下载到本地的方法
  • Asp.Net修改上传文件大小限制方法
  • asp.NET中实现文件的压缩和解压(3种方式)
  • ASP.NET文件上传Upload的实现方法
  • ASP.NET访问共享文件夹的详细步骤
  • ASP.NET文件上传Upload的实现方法
  • ASP.NET访问共享文件夹的详细步骤
  • asp.net core实现文件上传功能
  • asp.net图片文件的上传与删除方法

相关文章

  • 2018-08-20Asp.net mvc验证用户登录之Forms实现详解
  • 2017-05-11.NET中如何将文本文件的内容存储到DataSet
  • 2017-05-11ASP.NET微信公众号客服接口
  • 2017-05-11asp.net 大文件上传 之 改版了的SlickUpload.HttpUploadModule(Krystalware.SlickUpload.dll)
  • 2017-05-11Winform控件SaveFileDialog用于保存文件
  • 2017-05-11C#简单获取屏幕鼠标坐标点颜色方法介绍
  • 2017-05-11遍历Hashtable 的几种方法
  • 2017-05-11asp.net C#实现解压缩文件的方法
  • 2018-08-20asp.net实现的DES加密解密操作示例
  • 2017-05-11Opencv2.4.13与Visual Studio2013环境搭建配置教程

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ASP.NET URL伪静态重写实现方法
    • ASP.NET通过Remoting service上传文件
    • asp.net下检测远程URL是否存在的三种方法
    • Asp.Net+XML操作基类(修改,删除,新增,创建)第1/2页
    • asp.net Forms身份验证和基于角色的权限访问
    • ASP.NET中数据库操作初步
    • ASP.NET在MVC中MaxLength特性设置无效的解决方法
    • ADO与ADO.NET的区别与介绍
    • asp.net 操作XML 按指定格式写入XML数据 WriteXml
    • asp.net 虚拟主机时常出现MAC验证失败错误之解决方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有