iOS は SSZipArchive を変更して、解凍前に zip ファイル内のファイルのリストを取得する機能を強化します。

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

おすすめ

転載: blog.csdn.net/htwhtw123/article/details/129045719