65.9K
CodeProject 正在变化。 阅读更多。
Home

在 C# 中压缩/解压缩 Zip 文件,无需第三方库

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.89/5 (11投票s)

2013 年 8 月 29 日

CPOL

2分钟阅读

viewsIcon

78144

downloadIcon

6049

这是“使用 Windows Shell API 和 C# 压缩 Zip 文件”的替代方案

引言

这是对 "Gerald Gibson Jr" 的文章 "使用 Windows Shell API 和 C# 压缩 Zip 文件" 的后续。

我需要类似的功能来进行非常基本的压缩/解压缩,并且不想使用任何第三方库。 在我尝试的许多选项中,我认为 Windows Shell API 最适合我的目的。

当然,这并不是归档/解归档文件的最佳方式,但我发现这是实现我所需功能的其中一种最简单的方法。

背景

我在这里提供的是一个简单的包装类,用于使用 Windows Shell API 进行归档/解归档,具有(非常)最少的错误处理。 此外,我还包含了一个函数,用于将文件权限从一个文件复制到另一个文件。 在某些情况下,这可能很有用。

Using the Code

由于该类使用 Shell32 命名空间,因此应将对 Microsoft Shell Controls and Automation 的引用添加到项目中。 这将在 COM 引用部分中。 包装类名为 ArchiveManager,具有一些 public static 方法,这些方法公开了功能。

public static bool Archive(string archiveFile, string unArchiveFolder);
public static bool UnArchive(string archiveFile);
public static bool UnArchive(string archiveFile, string unArchiveFolder);
public static bool CopyPermissions(string sourceFile, string destFile) ;

方法名称相当自明,但是,示例控制台应用程序包含在附带的代码中,其中显示了包装类的示例用法。

string _sourceFile = "Template.zip";
if (!ArchiveManager.UnArchive(_sourceFile))
{  
   Console.WriteLine("ERROR: " + ArchiveManager.LastError);
}

可以使用类似的方式使用其他方法。

关注点

这种方法的一个问题是,用于创建/提取归档文件的 Shell32 API 是异步的。 这意味着我们的主线程无法确定归档/提取方法何时完成。

已经使用一种比较粗糙的方法来解决这个问题。 我使用了一个等待循环,该循环会一直休眠,直到源文件夹(或 Zip 文件)和目标文件夹(或 Zip 文件)中的项目数量相等,或者,发生可配置的超时。

历史

  • 原始发布时间:2013 年 8 月 29 日
© . All rights reserved.