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
}
}
分享到:
相关推荐
PHPZip类,生成zip格式的压缩包,生成压缩并下载,简单的zip压缩类
* @param zipFile 指定的ZIP压缩文件 * @param dest 解压目录 * @param passwd ZIP文件的密码 * @return 解压后文件数组 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ 方法详细见文件! 一个...
python代码实现pj zip解压缩文件 zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的 zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝...
zipfile模块及相关方法介绍: 1 压缩 1.1 创建zipfile对象 zipfile.ZipFile(file, mode='r', compression=0, allowZip64=True,...1.2 添加压缩文件 zipobj.write(self, filename, arcname=None, compress_type=None
Android端zip压缩与解压,目前暂时只做zip格式支持,基于Zip4j 进行扩展成工具类,支持对单个文件,多个文件以及文件夹进行压缩,对压缩文件解压到到指定目录,支持压缩解压使用密码。
zip压缩以及解压工具类,本人纯手打。其中包括zip所需要的jar 文件,copy到项目中可直接运行,以及工具类添加注释
使用 Java 语言实现并封装的创建 ZIP 格式的压缩文件并解压到指定目录和解压 ZIP 文件到指定目录的工具类。
ZipFile是主要的类,用来创建和读取zip文件而ZipInfo是存储的zip文件的每个文件的信息的。比如要读取一个Python zipfile 模块,这里假设filename是一个文件的路径:复制代码 代码如下:import zipfile z =zipfile....
模块提供类ZipFileExtended是python zipfile 实现的扩展,以支持从 zip 存档中重命名和删除文件。 ZipFileExtended:具有打开、读取、写入、删除、重命名、关闭和列出 Zip 文件的方法的类。 zip = ...
对文件进行zip压缩 和base64加密和解密的几个工具类
一、zipfile模块的简述 ...ZipFile是主要的类,用来创建和读取zip文件而ZipInfo是存储的zip文件的每个文件的信息的。 下面我们就来介绍这两个类的基本操作: 二、ZipFile和Zipinfo这两个类的基本操作 1、class zipf
ZIP是一种较为常见的压缩形式,在Java中要想实现ZIP的压缩需要导入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream、ZipEntry几个类完成。 ZipOutputStream 实现文件的压缩 ...
应用SharpCompress0.22开源包进行文件的解压缩(zip,rar文件),已处理中文乱码问题,例子很基础.源码环境 VS2017 15.3 .
zip文件是一种压缩文件,可以将一些文件和文件夹压缩成一个单一的、可移动的文件。它是一种非常有效的文件传输和存储格式,可以极大地减少文件的大小,提高文件传输的速度和存储的效率。 使用python解压zip文件,...
* @param directory 指定压缩文件路径 压缩到同目录 * @throws IOException * void */ public static void zip(String directory) throws FileNotFoundException, IOException { zip("", null,...
使用 net.lingala.zip4j包实现相关操作,相对于JDK自带的zip操作类,其不仅支持密码操作,更加简单方便,且不依赖其他类库。
好久以前的了,可能有点乱,见谅哈,压缩解压缩zip大概是Test9和ZipFile这两个类,然后Test9...解压rar,但是压缩文件为rar只能调用系统命令咯 另OfficeToHtml是实现word,ppt,excel转html的功能,是用jacob这个组件。
zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile类来操作zip文件,下面具体介绍一下: class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]]) 创建一个ZipFile对象,表示一个...
java实现对文件的基本操作,如创建,删除,读取,写入,解压缩,复制,移动等操作。{@link #createFile(String)} * * {@link #readFile(String, String)} * * {@link #moveFile(String, String)} * {@link #...
ZipFile是主要的类,用来创建和读取zip文件 ZipInfo是存储的zip文件的每个文件的信息的。 比如要读取一个zipfile,这里假设filename是一个文件的路径: import zipfile z = zipfile.ZipFile(filename, 'r') ...