在软件开发过程中,经常需要对文件进行压缩和解压缩操作。虽然有许多第三方库提供了这些功能,但有时出于各种原因,可能希望不依赖于这些外部库。本文将介绍一种使用Windows Shell API来实现文件压缩和解压缩的方法。
虽然这不是最优的文件归档/解归档方法,但发现这是实现所需功能的最简单方式之一。
这里介绍的是一个简单的包装类,用于使用Windows Shell API进行归档/解归档操作,并且错误处理非常基础。此外,还包含了一个将文件权限从一个文件复制到另一个文件的函数,这在某些情况下可能会有用。
由于类使用了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日
以下是一个简单的控制台应用程序,演示了如何使用ArchiveManager类进行文件的压缩和解压缩操作。
using System;
using System.IO;
namespace ArchiveDemo
{
class Program
{
static void Main(string[] args)
{
string sourceFile = @"C:\path\to\your\file.zip";
string destinationFolder = @"C:\path\to\destination\folder";
// 解压缩文件
if (!ArchiveManager.UnArchive(sourceFile, destinationFolder))
{
Console.WriteLine("ERROR: " + ArchiveManager.LastError);
}
else
{
Console.WriteLine("File has been successfully uncompressed.");
}
// 压缩文件
string archiveFile = @"C:\path\to\destination\folder.zip";
if (!ArchiveManager.Archive(archiveFile, destinationFolder))
{
Console.WriteLine("ERROR: " + ArchiveManager.LastError);
}
else
{
Console.WriteLine("File has been successfully archived.");
}
Console.ReadLine();
}
}
}