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;
}