SSZipArchive 作为开源解压压缩库,虽然非常好,用但是没有做解压前,获取zip文件中文件列表的函数。本文通过修改开源库中的SSZipArchived.h 和 SSZipArchived.m, 在这个文件里面加一个函数实现获取zip文件中文件列表的函数。
SSZipArchived.h中增加函数:
+ (NSArray<NSString *> *)geteZipFileList:(NSString *)zipPath;
SSZipArchived.m文件中增加函数:
+ (NSArray<NSString *> *)geteZipFileList:(NSString *)zipPath {
NSMutableArray *results = [NSMutableArray new];
unzFile uf = unzOpen(zipPath.UTF8String);
//如果为空则文件不存在
if (NULL == uf) {
printf("unzOpen failed...\n");
return results;
}
int ret = unzGoToFirstFile(uf);
if (UNZ_OK != ret) {
printf("GetFileInZip unzLocateFile failed... error:%d\n", ret);
return results;
}
unz_file_info file_info;
char filename_inzip[256];
//获取当前项的文件信息
ret = unzGetCurrentFileInfo(uf, &file_info, filename_inzip, sizeof(filename_inzip), NULL, 0, NULL, 0);
if (UNZ_OK != ret) {
printf("unzGetCurrentFileInfo failed... error:%d\n", ret);
return results;
}
NSString *fileName = [NSString stringWithFormat:@"%s", filename_inzip];
if (![fileName hasPrefix:@"__MACOSX/"]) {
[results addObject:fileName];
}
ret = unzGoToNextFile(uf);
while (ret != MZ_END_OF_LIST) {
if (UNZ_OK != ret) {
printf("GetFileInZip unzLocateFile failed... error:%d\n", ret);
break;
}
unz_file_info second_file_info;
char second_filename_inzip[256];
//获取当前项的文件信息
ret = unzGetCurrentFileInfo(uf, &second_file_info, second_filename_inzip, sizeof(second_filename_inzip), NULL, 0, NULL, 0);
if (UNZ_OK != ret) {
printf("unzGetCurrentFileInfo failed... error:%d\n", ret);
break;
}
//得到文件名(这样可以避免中文乱码)
NSString *second_fileName = [NSString stringWithUTF8String:second_filename_inzip];
if (![second_fileName hasPrefix:@"__MACOSX/"]) {
[results addObject:second_fileName];
}
ret = unzGoToNextFile(uf);
}
return results;
}