这里,我们来看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");break;case ERAR_EOPEN:if (ErrType == ERR_PROCESS) // Returned by RARProcessFile.printf("Volume open error");elseprintf("\nCannot open %s", ArcName);break;case ERAR_ECREATE:printf("File create error");break;case ERAR_ECLOSE:printf("File close error");break;case ERAR_EREAD:printf("Read error");break;case ERAR_EWRITE:printf("Write error");break;case ERAR_SMALL_BUF:printf("Buffer for archive comment is too small, comment truncated");break;case ERAR_UNKNOWN:printf("Unknown error");break;case ERAR_MISSING_PASSWORD:printf("Password for encrypted file or header is not specified");break;case ERAR_EREFERENCE:printf("Cannot open file source for reference record");break;case ERAR_BAD_PASSWORD:printf("Wrong password is specified");break;}
}void PrintHeaderInfo(RARHeaderDataEx header) {// 打印头信息printf("OS=");switch (header.HostOS) {case 0:printf("%s\n", "MS DOS");break;case 1:printf("%s\n", "OS/2");break;case 2:printf("%s\n", "Windows");break;case 3:printf("%s\n", "Unix");break;}// 压缩方法printf("Method=");switch (header.Method) {case 0x30:printf("%s\n", "Storing");break;case 0x31:printf("%s\n", "Fastest compression");break;case 0x32:printf("%s\n", "Fast compression");break;case 0x33:printf("%s\n", "Normal compression");break;case 0x34:printf("%s\n", "Good compression");break;case 0x35:printf("%s\n", "Best compression");break;}printf("File Attribute=%d\n", header.FileAttr);
}int main(int argc, char *argv[]) {if (argc < 2) {printf("%s\n", "Need Filename");return 1;}RAROpenArchiveDataEx data;RARHeaderDataEx header;memset(&header, 0, sizeof(header));memset(&data, 0, sizeof(data));char *ArcName = argv[1];data.ArcName = ArcName;// 只列举文件内容data.OpenMode = RAR_OM_LIST;HANDLE handle = RAROpenArchiveEx(&data);if (data.OpenResult != 0) {printf("%s\n", "Failed!");OutError(data.OpenResult, ArcName, ERR_OPEN);return 1;}int success;int code;//循环读取文件头信息while ((success = RARReadHeaderEx(handle, &header)) == 0) {//指向下1个文件头if ((code = RARProcessFile(handle, RAR_SKIP, NULL, NULL)) == 0) {if (header.Flags == RHDF_DIRECTORY) {//输出目录名称printf("Directory=%ws\n", header.FileNameW);} else {//输出文件名称printf("Filename=%ws\n", header.FileNameW);}}}printf("\n");PrintHeaderInfo(header);if (success != 0) {switch (success) {case ERAR_END_ARCHIVE:printf("%s\n", "End of archive");break;case ERAR_BAD_DATA:printf("%s\n", "File header broken");break;case ERAR_MISSING_PASSWORD:printf("%s\n", "Password was not provided for encrypted file header");break;}return 1;}RARCloseArchive(handle);return 0;
}

其结果类似如下:

Filename=Microsoft Visual C++ 2015-2019 Redistributable\Filename=Microsoft Visual C++ 2015-2019 Redistributabl
e\Filename=Microsoft Visual C++ 2015-2019 Redistributable\Filename=Microsoft Visual C++ 2015-2019 Redistributa
ble\Microsoft_Visual_CPP_2019_14.22.27821_Redistributable_x64.rar
Filename=Microsoft Visual C++ 2015-2019 Redistributable\Microsoft_Visual_CPP_2019_14.22.27821_Redistributable_
x86.rar
Filename=Microsoft Visual C++ 2015-2019 Redistributable                                                       OS=Windows
Method=Storing
File Attribute=16
End of archive

C-使用Unrar SDK列出文件示例相关推荐

  1. dir 列出文件清单_Windows Dir命令教程,以列出文件和文件信息的示例

    dir 列出文件清单 Dir command is one of the most used Windows commands. Dir is used mainly to list files an ...

  2. php遍历中记录所有,php遍历目录输出目录及其下的所有文件示例

    php遍历目录输出目录及其下的所有文件示例 好多次笔试都会遇到这个问题,所以特意给写了出来 复制代码 代码如下: function my_scandir($dir){ $files=array(); ...

  3. linux ls 命令 路径,使用ls命令在Linux中使用完整路径列出文件

    许多人会发现,这是重复的问题,但我已经经历了所有问题,然后问及这个主题,但没有为我工作.使用ls命令在Linux中使用完整路径列出文件 我想打印使用ls命令的特定文件格式的完整路径名到目前为止,我发现 ...

  4. csv文件示例_如何在R中使用数据框和CSV文件-带有示例的详细介绍

    csv文件示例 Welcome! If you want to start diving into data science and statistics, then data frames, CSV ...

  5. python列出文件夹最新的几个文件_Python列出一个文件夹及其子目录的所有文件

    python简介 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Perl ...

  6. 解决VS2015安装Android SDK 后文件不全及更新问题

    解决VS2015安装Android SDK 后文件不全及更新问题 参考文章: (1)解决VS2015安装Android SDK 后文件不全及更新问题 (2)https://www.cnblogs.co ...

  7. linux shell ls 列出文件绝对路径

    在ls中列出文件的绝对路径  原理是 在每行记录的开头加上当前路径 [root@69f677f93f97 tmp]# ls | sed "s:^:`pwd`/:" /tmp/ks- ...

  8. Asp.Net Web Api 2 实现多文件打包并下载文件示例源码

    前言 最近由于工作和个人事务,站点也好久没更新了,但这并不影响我对.NET的热情.站点的更新工作还是得想办法抽时间来完成的. 提要 今天利用中午的时间来写一篇关于Asp.Net Web Api下载文件 ...

  9. python列出文件夹所有文件_python列出文件夹所有文件有哪些方法?

    在python学习里,没有一个事物是可以忽略的,包括大家毫不在意的一个函数或者一个方法,很多时候,我们就是要通过那个方法去实现代码的编程,有个小伙伴咨询小编关于列出文件夹这个问题要学吗?那只能告诉大家 ...

最新文章

  1. Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf
  2. 报名 | 大数据打造智慧的政府门户讲座
  3. 数据量高并发的数据库优化
  4. 《Learning Scrapy》(中文版)第11章 Scrapyd分布式抓取和实时分析
  5. 计算机应用优质课资料,全国信息技术优质课一等奖教案——信息的收集
  6. php函数get和set,php中外部类调用_get函数和_set函数的方法
  7. 2011MBP在Win7下打开ACHI
  8. 韩国冬奥:未来科技奥运我要长这样,阿里巴巴:你尽管想
  9. Dom 和 Jquery,json对象的使用方法
  10. 由a标签的onclick影出来的问题
  11. 怎么样用计算机才能让电量增多,如何让你的笔记本更省电 这几招你学会能管大用...
  12. 内存图片IOS app启动动画的实现
  13. 在Linux上安装和配置CSF防火墙
  14. linux版本i686,在Ubuntu中'i686'是什么意思? - Ubuntu问答
  15. MCAL配置-Cdd_Ipc
  16. excel中文件格式与扩展名对应关系
  17. 套接字基础与UDP通信
  18. Unity3D学习笔记(十二)预制
  19. 大恒相机MER-302-56U3M在Linux环境下采集图像
  20. Java百度识别身份证照片、驾驶证识别

热门文章

  1. 制作flash动画的心得
  2. 再装亿遍Ubuntu18.04+win10,致敬我们装机逝去的青春
  3. 非AJAX的CRUD,使用Node.js+Express+ejs的动态技术--图书管理系统之查询操作
  4. PDF格式转WORD要钱?Python几秒就能完成。
  5. photoshopcs5 win7安装报错的解决
  6. bios 传统测试软件性能,设置主板BIOS上的CPU部分及性能测试_技嘉 GA-G1.Sniper B5_主板评测-中关村在线...
  7. 《别告诉我你懂PPT》札记
  8. 基本靠谱的渗透测试书籍
  9. CI 漂亮的分页样式(页码样式)
  10. 【unity】 PureMvc 入门尝试小案例