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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在MFC解压ZIP文件并显示进度,可以使用Windows APIZipArchive类和ZipFile类。以下是一个简单的示例代码,可以在MFC应用程序使用: ```c++ #include <iostream> #include <fstream> #include <Windows.h> #include <zipapi.h> // 回调函数,用于显示解压进度 BOOL CALLBACK MyProgressCallback(ZIP_PROGRESS_CALLBACK_REASON reason, DWORD64 bytesProcessed, DWORD64 totalBytesToProcess, PVOID userData) { int progress = (int)(bytesProcessed * 100 / totalBytesToProcess); std::cout << "Unzipping: " << progress << "%" << std::endl; return TRUE; } void UnzipFile(LPCTSTR zipFileName, LPCTSTR destFolder) { // 创建ZipArchive对象 ZipArchive zipArchive; if (!zipArchive.Open(zipFileName)) { std::cout << "Failed to open zip file" << std::endl; return; } // 获取ZIP文件文件数量 int fileCount = zipArchive.GetFileCount(); // 遍历ZIP文件的所有文件 for (int i = 0; i < fileCount; i++) { // 获取文件名和文件大小 CString fileName = zipArchive.GetFileName(i); DWORD fileSize = zipArchive.GetFileSize(i); // 创建ZipFile对象 ZipFile zipFile; if (!zipFile.Open(&zipArchive, i)) { std::cout << "Failed to open zip file for reading" << std::endl; continue; } // 创建目标文件 CString destFilePath = destFolder + fileName; std::ofstream destFile(destFilePath, std::ios::out | std::ios::binary); if (!destFile) { std::cout << "Failed to create destination file" << std::endl; continue; } // 解压文件并显示进度 if (!zipFile.ExtractFile(&MyProgressCallback, NULL, &destFile)) { std::cout << "Failed to extract file: " << fileName << std::endl; continue; } std::cout << "Extracted file: " << fileName << std::endl; } } int main() { LPCTSTR zipFileName = L"C:\\test.zip"; LPCTSTR destFolder = L"C:\\test\\"; UnzipFile(zipFileName, destFolder); return 0; } ``` 在上面的示例代码,我们首先通过ZipArchive类打开ZIP文件,然后遍历ZIP文件的所有文件,并使用ZipFile类将文件解压到目标文件。在解压过程,我们使用回调函数MyProgressCallback来显示解压进度,该函数在解压每个文件都会被调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值