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
}
}
分享到:
相关推荐
### Python中zipfile压缩文件模块的基本使用教程 #### 概述 `zipfile`模块是Python内置的一个标准库,主要用于处理ZIP格式的压缩文件。它提供了丰富的API接口,可以实现ZIP文件的创建、读取、追加以及提取等功能。...
在提供的压缩文件类中,我们可能会看到以下核心功能的实现: 1. **初始化**:类的构造函数可能接受一个参数,比如文件路径或者已经存在的压缩文件,用于初始化压缩或解压缩操作。 2. **压缩文件**:一个名为`...
`ZipFile`类库是.NET Framework提供的一种强大的工具,专门用于处理ZIP格式的压缩文件。本篇文章将深入探讨如何使用`ZipFile`库来实现目录的压缩和解压缩功能,以及如何支持二级解压。 首先,`ZipFile`类位于`...
* @param zipFile 指定的ZIP压缩文件 * @param dest 解压目录 * @param passwd ZIP文件的密码 * @return 解压后文件数组 * @throws ZipException 压缩文件有损坏或者解压缩失败抛出 */ 方法详细见文件! 一个...
PHPZip类,生成zip格式的压缩包,生成压缩并下载,简单的zip压缩类
这里,我们遍历指定目录及其子目录中的所有文件,创建相应的ZipArchiveEntry并添加到压缩文件中。 **解压缩文件** 1. 解压缩到指定目录: ```csharp public static void ExtractToDirectory(string zipFile, ...
1. **压缩文件**: - `ZipFile.CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName)`: 这个方法用于将指定目录下的所有文件和子目录压缩成一个ZIP文件。 - `ZipFile.AddFile...
- **Entries** 属性:提供对ZIP文件中所有条目的访问,可以通过遍历此属性来处理每个压缩文件。 3. **源码实现**: 源码通常会包含一个或多个类,这些类封装了ZipFile的基本操作,如Compress和Decompress方法,...
至于你提到的"zipfile",这可能是实际的压缩文件名或者一个包含多个子文件的压缩文件。如果你需要将这些子文件添加到新的压缩文件,你可以迭代`ZipArchiveEntry`,并使用`CopyToStream`方法将它们复制到新的`Zip...
CZip和CUnzip是两个非常实用的类,它们分别用于文件的压缩和解压缩操作,是ZLib库的一个MFC封装,使得在MFC项目中使用起来更加方便。本文将详细介绍如何使用CZip和CUnzip类来处理文件的压缩与解压缩任务。 首先,...
在Android开发中,有时我们需要将应用内部的资源文件,如ZIP压缩文件,解压到外部存储(即SD卡)上,以便用户可以访问或使用这些数据。本文将详细讲解如何实现这一功能,主要涉及Android权限管理、文件操作以及ZIP...
解压缩ZIP文件,我们可以使用ZipFile.ExtractToDirectory方法,将整个ZIP文件内容解压到目标目录。以下是解压缩的代码示例: ```csharp using System.IO; using System.IO.Compression; public void ...
在.NET Framework或.NET Core中,我们可以使用`System.IO.Compression`命名空间下的`ZipFile`类来处理ZIP文件的压缩和解压缩。以下是一些基本的步骤和代码示例: ### 1. 压缩文件或文件夹 要压缩一个文件或文件夹...
3. 解压缩文件:解压缩文件则需要使用ZipFile或SevenZipExtractor类。通过遍历压缩文件中的每个条目,然后读取并写入到目标位置。 ```csharp using ICSharpCode.SharpZipLib.Zip; // 解压缩ZIP文件 using ...
在C#编程环境中,处理压缩文件是常见的任务之一,尤其是当你需要打包或解压数据时。ZIP格式是一种广泛使用的压缩格式,它允许我们将多个文件压缩到一个单一的ZIP档案中,以便于存储、传输和分享。本文将深入探讨如何...
2. **压缩文件**: 使用`ZipOutputStream`,你可以将文件或目录添加到ZIP文件中。首先,创建一个`ZipOutputStream`实例,然后通过调用`putNextEntry`方法开始新的`ZipEntry`,接着使用`write`方法写入文件数据,最后...
另外,`zipfile`和`tarfile`也可以用于处理从互联网下载的压缩文件,如自动解压缩并处理下载的资源。 5. **文件分析** 根据给定的文件名列表,`zip_tar.py`可能是一个实现压缩和解压缩功能的Python脚本,而`___...
python代码实现pj zip解压缩文件 zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的 zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝...
在Python编程语言中,`zip`模块是一个非常重要的工具,用于处理ZIP格式的压缩文件。这个模块提供了全面的功能,包括创建、读取、写入和更新ZIP文件,甚至支持处理加密的压缩文件。本文将详细介绍如何使用Python的`...
ZipFile用于处理整个压缩文件,而ZipArchive则用于处理压缩文件中的单个条目(即压缩后的文件或目录)。 ### 压缩文件 在C#中压缩文件的基本步骤如下: 1. **创建ZipArchive对象**:使用`ZipFile....