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

CUnrarDLL 1.0 - 基于 MFC 的 UnRAR 类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.69/5 (9投票s)

2005年8月3日

2分钟阅读

viewsIcon

86042

downloadIcon

8881

一个易于使用的基于 unrar.dll 的类。

Sample Image - unrar.png

引言

在我的一个最新项目中,我一直在研究现有的解压缩类,用于 Zip 文件。我注意到,对于某些文件,RAR 具有更好的压缩比,并且现有的 DLL 本身处理一切,包括最新版本的 RAR 格式。

该类如何使用 'unrar.dll'?

Unrar.dll 由 RarLabs 免费分发并正式发布。它是现有应用程序用来操作 RAR 归档文件的接口。在该类中,从 DLL 导出了五个函数并使用它们。

HANDLE (WINAPI *OpenArchiveEx)(RAROpenArchiveDataEx *pArchiveData);
int    (WINAPI *CloseArchive)(HANDLE hArcData);
int    (WINAPI *ReadRARHeader)(HANDLE hArcData, 
               RARHeaderData *pHeaderData);
int    (WINAPI *ProcessRARFile)(HANDLE hArcData, 
               int iOperation, char* strDestFolder, char* strDestName);
int    (WINAPI *ReadRARHeaderEx)(HANDLE hArcData, 
               struct RARHeaderDataEx *HeaderData);

OpenArchiveEx 与 'RAROpenArchiveDataEx' 结构一起使用,以获取打开的归档文件的句柄(如果成功)。然后可以在后续的 DLL 调用中使用它。 ReadRARHeader 是我在核心 UnRAR 函数中使用的函数。它用于处理 RAR 的标头,以获取有关 RAR 中包含的文件信息。它将 RARHeaderData 结构填充信息,包括文件名、打包大小、解包大小等。 ProcessRARFile 用于对 RAR 归档文件中的当前文件执行操作。这可以是 测试提取 或完全 跳过 该文件。调用后,它将移动到归档文件中的下一个文件。 CloseArchive 用于关闭从 OpenArchiveEx 获得的 HANDLEReadRARHeaderExReadRARHeader 相同,但包含额外信息,例如 Unicode 文件名。

工作原理

CUnrarDLL 将 'unrar.dll'(可从 WinRAR 网站 免费获得)及其接口封装到一个简洁、易于使用的 MFC 类中。解压 RAR 归档文件变得前所未有的简单。

这是一个例子

// Define an UnRAR object
CUnrarDLL unrarObj;
// Load the RAR file
unrarObj.OpenRARFile("MyContent.rar");
// Set the output directory
unrarObj.SetOutputDirectory("C:\\Output");
// UnRAR the archive
unrarObj.UnRARArchive();

这些都很好,但是如果你想在提取之前了解归档文件中的更多信息呢?没问题。有两种方法可以获取信息。第一种是在调用 'OpenRARFile' 时自动完成的。打开后,CUnrarDLL 将所有文件及其打包和解包大小加载到向量中,如下所示可以检查:

// Open the RAR file unrarObj.OpenRARFile("MyContent.rar");
// String to show
CString fileInfo;
// File
CUnrarFile curFile;
// Loop through the files and show them
for (int i = 0; i < unrarObj.GetNumberOfFiles(); i++) {
    curFile = unrarObj.GetFileAt(i);
    fileInfo.Format("File name: %s\nPacked size:" 
           " %I64d\nUnpacked size: %I64d",
           curFile.fileName, curFile.packSize, curFile.unpackSize);
    MessageBox(fileInfo);
}

另一种已实现的方法是 'ListFileNames',它会将文件名列表放入 CStringArray 中。

更新

  • 2005 年 8 月 4 日:更新了文章。
  • 2005 年 8 月 3 日:初始发布。
© . All rights reserved.