|

楼主 |
发表于 2025-1-24 10:29:00
|
显示全部楼层
这是minizip 解压压缩文件包的 需要移植minizip修改它的 文件接口 内存接口 处理掉编译error,使用了外置sdram
有很多问题,网上资料也找不到......
/**
* minizip解压压缩文件夹,测试去除文件数据buf大概需要使用...不知道300k吧... 目前有8m ram用 所以任性给了
* 组合minizip接口实现多文件,小文件解压缩(没有分包处理),保证ram空间足够
* 函数每解压一个文件都重新开关了压缩包并清除了之前的数据,因为每解压四个文件总是出现 DATA_ERROR(zlib的故障码)
* 如果写入文件与读取文件内容对不上就重新解压重新写(发现随机出现写的数据不对)
* 过程:
* 打开压缩包,获取信息记录信息,关闭压缩包
* (错误重新写跳转位置)打开压缩包,找到第一个,判断是否需要往后找,拿名字,解压,写(错误跳到重新写)
* 释放,关文件等操作然后继续循环
* 结束
*/
int32_t unzip_file(void)
{
char *p_unzipfileName = NULL; // 用来获取文件名称
char *p_readBuf = NULL; // 动态申请读空间指针
char *p_writeBuf = NULL; // 动态申请读空间指针
int8_t fileIndex = 0;
static uint8_t fileNUM = 0; // 压缩包包含文件个数
static uint8_t nextDealNum = 0; // 处理的文件序号
// const uint32_t onceSize = 10*1024; // 单次最大10k
// uint32_t lastSize = 0; // 最后一次解压大小
// uint32_t uncompressTimes = 0; // 单个文件解压次数
uint32_t readSize = 0;
uint32_t writeSize = 0;
int32_t ret = 0;
unzFile unzipFile;
unz_global_info64 global_info; // 获取压缩包信息
unz_file_info64 file_info;
unzipFile = unzOpen2_64("1:txt.zip",&zipffunc); // 打开压缩包
if(NULL == unzipFile)
{
return -1;
}
if(UNZ_OK != unzGetGlobalInfo64(unzipFile,&global_info))
{
unzClose(unzipFile);
return -1;
}
fileNUM = global_info.number_entry; // 记录文件个数
nextDealNum = 0; // 从0开始
if(UNZ_OK != unzGoToFirstFile(unzipFile))
{
unzClose(unzipFile);
return -1;
}
unzClose(unzipFile); // 关闭压缩包,解压过程会再次打开
for(uint32_t i=0;i<fileNUM;i++)
{
REDEAL: //=========================== 跳转到此处重新处理该文件
memset(&file_info,0,sizeof(unz_file_info64)); // 清除记录信息
memset(FILE_PATH_BUF,0,sizeof(FILE_PATH_BUF));
memset(unzipFile,0,sizeof(unz64_s));
unzipFile = unzOpen2_64("1:txt.zip",&zipffunc); // 打开压缩包
if(NULL == unzipFile)
{
return -1;
}
if(UNZ_OK != unzGoToFirstFile(unzipFile))
{
unzClose(unzipFile);
return -1;
}
for(uint8_t j=0;j<nextDealNum;j++)
{
if(unzGoToNextFile(unzipFile) != UNZ_OK)
{
unzClose(unzipFile);
return -1;
}
}
p_unzipfileName = my_malloc(100);
if(unzGetCurrentFileInfo64(unzipFile,&file_info,p_unzipfileName,100,NULL,0,NULL,0) != UNZ_OK)
{
unzClose(unzipFile);
return -1;
}
my_free(p_unzipfileName);
sprintf(FILE_PATH_BUF,"1:%s",p_unzipfileName);
ret = FileOpen(FILE_PATH_BUF,WRITE_CREATE,&fileIndex);
if (ret < 0)
{
unzClose(unzipFile);
return -1;
}
if(unzOpenCurrentFile(unzipFile) != UNZ_OK)
{
fileCloseFp(fileIndex);
unzClose(unzipFile);
return -1;
}
p_readBuf = my_malloc(file_info.uncompressed_size);
p_writeBuf = my_malloc(file_info.uncompressed_size);
do
{
readSize = unzReadCurrentFile(unzipFile, p_readBuf, file_info.uncompressed_size);
if(readSize)
{
mymemcpy(p_writeBuf,p_readBuf,readSize); // TODO 测试时发现读取缓冲区在写文件时总是被意外更改
FileWritefs(fileIndex, p_writeBuf, readSize, &writeSize);
if(writeSize != readSize)
{
// 重新创建文件
fileCloseFp(fileIndex);
my_free(p_readBuf); // 无论如何释放空间
my_free(p_writeBuf); // 无论如何释放空间
if(unzCloseCurrentFile(unzipFile) != UNZ_OK)
{
return -1;
}
unzClose(unzipFile); // 关闭压缩包
goto REDEAL; // TODO !!!!注意此处进行了跳转重新处理此文件解压与写入,写入可能失败
}
fileCloseFp(fileIndex);
ret = FileOpen(FILE_PATH_BUF,ONLY_READ,&fileIndex);
if (ret != 0)
{
unzClose(unzipFile); // 关闭压缩包
return -1;
}
FileReadfs(fileIndex, BUF_1M, readSize, &writeSize);
if (ret != 0)
{
fileCloseFp(fileIndex);
unzClose(unzipFile); // 关闭压缩包
return -1;
}
// 对比buf
for(uint32_t n = 0; n<readSize; n++)
{
if(BUF_1M[n] != p_readBuf[n])
{
// 重新创建文件
fileCloseFp(fileIndex);
my_free(p_readBuf); // 无论如何释放空间
my_free(p_writeBuf); // 无论如何释放空间
if(unzCloseCurrentFile(unzipFile) != UNZ_OK)
{
unzClose(unzipFile); // 关闭压缩包
return -1;
}
unzClose(unzipFile); // 关闭压缩包
goto REDEAL; // TODO !!!!注意此处进行了跳转重新处理此文件解压与写入,写入可能失败
}
}
}
else
{
break;
}
} while (1);
my_free(p_readBuf); // 无论如何释放空间
my_free(p_writeBuf); // 无论如何释放空间
my_free(p_unzipfileName);
fileCloseFp(fileIndex);
if(unzCloseCurrentFile(unzipFile) != UNZ_OK)
{
unzClose(unzipFile); // 关闭压缩包
return -1;
}
nextDealNum++;
unzClose(unzipFile); // 关闭压缩包
}
return 0;
} |
|