C-使用Unrar SDK列出文件示例

本文展示了如何在Windows环境下使用Unrar SDK来列举RAR文件的内容。通过设置ArcName和OpenMode,调用相应函数读取文件头并处理文件,实现对RAR文件的只读操作。
摘要由CSDN通过智能技术生成

这里,我们来看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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值