这里,我们来看1个Unrar官方提供的SDK实现rar文件列举的实例。
以下内容主要运行在Windows环境下,对于Linux需要进行适当的修改。
首先需要使用到RAROpenArchiveEx
函数,其原型为:
HANDLE PASCAL RAROpenArchiveEx(struct RAROpenArchiveDataEx *ArchiveData)
其参数为1个结构体RAROpenArchiveDataEx
,其结构如下:
struct RAROpenArchiveDataEx { char *ArcName; wchar_t *ArcNameW; unsigned int OpenMode; unsigned int OpenResult; char *CmtBuf; unsigned int CmtBufSize; unsigned int CmtSize; unsigned int CmtState; unsigned int Flags; UNRARCALLBACK Callback; LPARAM UserData; unsigned int OpFlags; wchar_t *CmtBufW; unsigned int Reserved[25]; };
在这里主要设置ArcName和OpenMode,其中前者表示压缩包的文件路径,而后者可选值主要有:
RAR_OM_LIST
,只读取文件头RAR_OM_EXTRACT
,用于测试和解压文件
接着使用RARReadHeaderEx
函数读取压缩包文件头:
int PASCAL RARReadHeaderEx(HANDLE hArcData,struct RARHeaderDataEx *HeaderData)
其中RARHeaderDataEx结构体如下:
struct RARHeaderDataEx { char ArcName[1024]; wchar_t ArcNameW[1024]; char FileName[1024]; wchar_t FileNameW[1024]; unsigned int Flags; unsigned int PackSize; unsigned int PackSizeHigh; unsigned int UnpSize; unsigned int UnpSizeHigh; unsigned int HostOS; unsigned int FileCRC; unsigned int FileTime; unsigned int UnpVer; unsigned int Method; unsigned int FileAttr; char *CmtBuf; unsigned int CmtBufSize; unsigned int CmtSize; unsigned int CmtState; unsigned int DictSize; unsigned int HashType; char Hash[32]; unsigned int RedirType; wchar_t *RedirName; unsigned int RedirNameSize; unsigned int DirTarget; unsigned int MtimeLow; unsigned int MtimeHigh; unsigned int CtimeLow; unsigned int CtimeHigh; unsigned int AtimeLow; unsigned int AtimeHigh; unsigned int Reserved[988]; };
最后是RARProcessFileW,用于文件的处理,这里是让其转向下1个头部,其原型为:
int PASCAL RARProcessFileW(HANDLE hArcData,int Operation,wchar_t *DestPath,wchar_t *DestName)
下面是对应实现的代码:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <unrar.h>
enum ERR_TYPE {
ERR_OPEN, ERR_READ, ERR_PROCESS
};
typedef struct RARHeaderDataEx RARHeaderDataEx;
typedef struct RAROpenArchiveDataEx RAROpenArchiveDataEx;
void OutError(int Error, char *ArcName, int ErrType) {
switch (Error) {
case ERAR_NO_MEMORY:
printf("\nNot enough memory");
break;
case ERAR_BAD_DATA:
printf("\n%s: archive header or data are damaged", ArcName);
break;
case ERAR_BAD_ARCHIVE:
printf("\n%s is not RAR archive", ArcName);
break;
case ERAR_UNKNOWN_FORMAT:
printf("Unknown archive format"