`
wsql
  • 浏览: 11787212 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

压缩文件类的ZipFile

 
阅读更多
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Packaging;
using System.IO;
using Utilities.IO.ExtensionMethods;
using Utilities.DataTypes.ExtensionMethods;


namespace Utilities.FileFormats.Zip
{
/// <summary>
/// Helper class for dealing with zip files
/// </summary>
public class ZipFile : IDisposable
{
#region Constructor

/// <summary>
/// Constructor
/// </summary>
/// <param name="FilePath">Path to the zip file</param>
/// <param name="Overwrite">Should the zip file be overwritten?</param>
public ZipFile(string FilePath, bool Overwrite = true)
{
FilePath.ThrowIfNullOrEmpty("FilePath");
ZipFileStream = new FileStream(FilePath, Overwrite ? FileMode.Create : FileMode.OpenOrCreate);
}

#endregion

#region Properties

/// <summary>
/// Zip file's FileStream
/// </summary>
protected virtual FileStream ZipFileStream { get; set; }

#endregion

#region Functions

/// <summary>
/// Adds a folder to the zip file
/// </summary>
/// <param name="Folder">Folder to add</param>
public virtual void AddFolder(string Folder)
{
Folder.ThrowIfNullOrEmpty("Folder");
Folder = new DirectoryInfo(Folder).FullName;
if (Folder.EndsWith(@"\"))
Folder = Folder.Remove(Folder.Length - 1);
using (Package Package = ZipPackage.Open(ZipFileStream, FileMode.OpenOrCreate))
{
new DirectoryInfo(Folder)
.GetFiles()
.ForEach(x => AddFile(x.FullName.Replace(Folder, ""), x, Package));
}
}

/// <summary>
/// Adds a file to the zip file
/// </summary>
/// <param name="File">File to add</param>
public virtual void AddFile(string File)
{
File.ThrowIfNullOrEmpty("File");
FileInfo TempFileInfo = new FileInfo(File);
if (!TempFileInfo.Exists)
throw new ArgumentException("File");
using (Package Package = ZipPackage.Open(ZipFileStream, FileMode.OpenOrCreate))
{
AddFile(TempFileInfo.Name, TempFileInfo, Package);
}
}

/// <summary>
/// Uncompresses the zip file to the specified folder
/// </summary>
/// <param name="Folder">Folder to uncompress the file in</param>
public virtual void UncompressFile(string Folder)
{
Folder.ThrowIfNullOrEmpty("Folder");
new DirectoryInfo(Folder).Create();
Folder = new DirectoryInfo(Folder).FullName;
using (Package Package = ZipPackage.Open(ZipFileStream, FileMode.Open, FileAccess.Read))
{
foreach (PackageRelationship Relationship in Package.GetRelationshipsByType("http://schemas.microsoft.com/opc/2006/sample/document"))
{
Uri UriTarget = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), Relationship.TargetUri);
PackagePart Document = Package.GetPart(UriTarget);
Extract(Document, Folder);
}
if (File.Exists(Folder + @"\[Content_Types].xml"))
File.Delete(Folder + @"\[Content_Types].xml");
}
}

/// <summary>
/// Extracts an individual file
/// </summary>
/// <param name="Document">Document to extract</param>
/// <param name="Folder">Folder to extract it into</param>
protected virtual void Extract(PackagePart Document, string Folder)
{
Folder.ThrowIfNullOrEmpty("Folder");
string Location = Folder + System.Web.HttpUtility.UrlDecode(Document.Uri.ToString()).Replace('\\', '/');
new DirectoryInfo(Path.GetDirectoryName(Location)).Create();
byte[] Data = new byte[1024];
using (FileStream FileStream = new FileStream(Location, FileMode.Create))
{
Stream DocumentStream = Document.GetStream();
while (true)
{
int Size = DocumentStream.Read(Data, 0, 1024);
FileStream.Write(Data, 0, Size);
if (Size != 1024)
break;
}
FileStream.Close();
}
}

/// <summary>
/// Adds a file to the zip file
/// </summary>
/// <param name="File">File to add</param>
/// <param name="FileInfo">File information</param>
/// <param name="Package">Package to add the file to</param>
protected virtual void AddFile(string File, FileInfo FileInfo, Package Package)
{
File.ThrowIfNullOrEmpty("File");
if (!FileInfo.Exists)
throw new ArgumentException("FileInfo");
Uri UriPath = PackUriHelper.CreatePartUri(new Uri(File, UriKind.Relative));
PackagePart PackagePart = Package.CreatePart(UriPath, System.Net.Mime.MediaTypeNames.Text.Xml, CompressionOption.Maximum);
byte[] Data = FileInfo.ReadBinary();
PackagePart.GetStream().Write(Data, 0, Data.Count());
Package.CreateRelationship(PackagePart.Uri, TargetMode.Internal, "http://schemas.microsoft.com/opc/2006/sample/document");
}

#endregion

#region IDisposable Members

public void Dispose()
{
if (ZipFileStream != null)
{
ZipFileStream.Close();
ZipFileStream.Dispose();
ZipFileStream = null;
}
}

#endregion
}
}
分享到:
评论

相关推荐

    ZipFile.php(PHP压缩类,打包下载)

    PHPZip类,生成zip格式的压缩包,生成压缩并下载,简单的zip压缩类

    java压缩文件生成带密码的zip包,解压带密码的zip包的工具类

    * @param zipFile 指定的ZIP压缩文件 * @param dest 解压目录 * @param passwd ZIP文件的密码 * @return 解压后文件数组 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ 方法详细见文件! 一个...

    python代码实现pj zip解压缩文件

    python代码实现pj zip解压缩文件 zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的 zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝...

    详解Python 解压缩文件

    zipfile模块及相关方法介绍: 1 压缩 1.1 创建zipfile对象 zipfile.ZipFile&#40;file, mode='r', compression=0, allowZip64=True,...1.2 添加压缩文件 zipobj.write(self, filename, arcname=None, compress_type=None

    Android-Android端zip压缩与解压支持使用密码对单文件多文件文件夹进行压缩以及解压操作

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

    zip压缩java工具类包含jar文件

    zip压缩以及解压工具类,本人纯手打。其中包括zip所需要的jar 文件,copy到项目中可直接运行,以及工具类添加注释

    使用 Java 实现的压缩/解压 ZIP 文件的工具类

    使用 Java 语言实现并封装的创建 ZIP 格式的压缩文件并解压到指定目录和解压 ZIP 文件到指定目录的工具类。

    Python ZipFile模块详解

    ZipFile是主要的类,用来创建和读取zip文件而ZipInfo是存储的zip文件的每个文件的信息的。比如要读取一个Python zipfile 模块,这里假设filename是一个文件的路径:复制代码 代码如下:import zipfile z =zipfile....

    zipextended:pythons zipfile 实现的扩展以支持重命名和删除文件

    模块提供类ZipFileExtended是python zipfile 实现的扩展,以支持从 zip 存档中重命名和删除文件。 ZipFileExtended:具有打开、读取、写入、删除、重命名、关闭和列出 Zip 文件的方法的类。 zip = ...

    将文件进行zip压缩并base64加密和解密

    对文件进行zip压缩 和base64加密和解密的几个工具类

    详解python3中zipfile模块用法

    一、zipfile模块的简述 ...ZipFile是主要的类,用来创建和读取zip文件而ZipInfo是存储的zip文件的每个文件的信息的。 下面我们就来介绍这两个类的基本操作: 二、ZipFile和Zipinfo这两个类的基本操作 1、class zipf

    JAVA文件压缩与解压缩的设计与实现(源代码+论文)

    ZIP是一种较为常见的压缩形式,在Java中要想实现ZIP的压缩需要导入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream、ZipEntry几个类完成。 ZipOutputStream 实现文件的压缩 ...

    SharpCompress 解压缩zip,rar文件,解决中文乱码

    应用SharpCompress0.22开源包进行文件的解压缩(zip,rar文件),已处理中文乱码问题,例子很基础.源码环境 VS2017 15.3 .

    python 解压zip文件源码

    zip文件是一种压缩文件,可以将一些文件和文件夹压缩成一个单一的、可移动的文件。它是一种非常有效的文件传输和存储格式,可以极大地减少文件的大小,提高文件传输的速度和存储的效率。 使用python解压zip文件,...

    org.apache.tools.zip解决解压乱码问题

    * @param directory 指定压缩文件路径 压缩到同目录 * @throws IOException * void */ public static void zip(String directory) throws FileNotFoundException, IOException { zip("", null,...

    Zip4j文件工具类

    使用 net.lingala.zip4j包实现相关操作,相对于JDK自带的zip操作类,其不仅支持密码操作,更加简单方便,且不依赖其他类库。

    压缩解压缩word转html

    好久以前的了,可能有点乱,见谅哈,压缩解压缩zip大概是Test9和ZipFile这两个类,然后Test9...解压rar,但是压缩文件为rar只能调用系统命令咯 另OfficeToHtml是实现word,ppt,excel转html的功能,是用jacob这个组件。

    Python中的zipfile模块使用详解

    zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile类来操作zip文件,下面具体介绍一下: class zipfile.ZipFile&#40;file[, mode[, compression[, allowZip64]]]&#41; 创建一个ZipFile对象,表示一个...

    文件操作类(java)

    java实现对文件的基本操作,如创建,删除,读取,写入,解压缩,复制,移动等操作。{@link #createFile(String)} * * {@link #readFile(String, String)} * * {@link #moveFile(String, String)} * {@link #...

    Python模块zipfile原理及使用方法详解

    ZipFile是主要的类,用来创建和读取zip文件 ZipInfo是存储的zip文件的每个文件的信息的。 比如要读取一个zipfile,这里假设filename是一个文件的路径: import zipfile z = zipfile.ZipFile&#40;filename, 'r'&#41; ...

Global site tag (gtag.js) - Google Analytics