使用libzip读取修改zip文件comment的方法(支持添加扩展字符)

本文介绍如何使用libzip读取和修改zip文件的comment,包括修改libzip源码以支持扩展字符,以及提供测试代码和参考资料。
摘要由CSDN通过智能技术生成

2014-10-01 wcdj

摘要:本文使用libzip读取和修改zip文件comment的方法,并支持添加扩展字符。前提是需要修改libzip的源码支持可以添加扩展字符, 否则_zip_guess_encoding会判断出错(修改代码 zip_set_archive_comment.c:65)。

0 方法

(1) 首先要安装zlib和libzip编译环境:

初始化编译libzip
./configure --prefix="/Users/gerryyang/LAMP/libzip/install/libzip-0.11.2" --with-zlib="/Users/gerryyang/LAMP/zlib/install/zlib-1.2.8"

(2) 修改libzip的源码:

去除对comment编码格式的判断,zip_set_archive_comment.c:65

ZIP_EXTERN int
zip_set_archive_comment(struct zip *za, const char *comment, zip_uint16_t len)
{
	struct zip_string *cstr;

	if (ZIP_IS_RDONLY(za)) {
		_zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
		return -1;
	}

	if (len > 0 && comment == NULL) {
		_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
		return -1;
	}

	if (len > 0) {
		if ((cstr=_zip_string_new((const zip_uint8_t *)comment, len, ZIP_FL_ENC_GUESS, &za->error)) == NULL)
		{
			printf("_zip_string_new err\n");
			return -1;
		}

#if 0
		if (_zip_guess_encoding(cstr, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_CP437) {
			printf("_zip_guess_encoding err\n");
			_zip_string_free(cstr);
			_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
			return -1;
		}
#endif
	}
	else
		cstr = NULL;

	_zip_string_free(za->comment_changes);
	za->comment_changes = NULL;

	if (((za->comment_orig && _zip_string_equal(za->comment_orig, cstr))
				|| (za->comment_orig == NULL && cstr == NULL))) {
		_zip_string_free(cstr);
		za->comment_changed = 0;
	}
	else {
		za->comment_changes = cstr;
		za->comment_changed = 1;
	}

	return 0;
}
你可以使用libzip库来解压zip文件,并使用MFC提供的进度条控件来显示解压进度。以下是大致的实现思路: 1. 下载和安装libzip库,并将其包含在项目中。 2. 在MFC应用程序中创建一个对话框,并添加一个进度条控件。 3. 在对话框类中,添加一个函数来解压zip文件并显示解压进度。 4. 在该函数中,首先打开zip文件,然后获取文件总数并设置进度条的范围。 5. 然后遍历zip文件中的每个文件,并解压它们。每次解压一个文件时,更新进度条的当前位置。 6. 最后关闭zip文件,完成解压过程。 以下是一个简单的代码示例,用于演示如何使用libzip和MFC进度条来解压zip文件: ``` #include "stdafx.h" #include "ZipDlg.h" #include "zip.h" #define ZIP_BUFFER_SIZE 1024 // CZipDlg 对话框 IMPLEMENT_DYNAMIC(CZipDlg, CDialogEx) CZipDlg::CZipDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_ZIP_DIALOG, pParent) { } CZipDlg::~CZipDlg() { } void CZipDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_PROGRESS1, m_progress); } BEGIN_MESSAGE_MAP(CZipDlg, CDialogEx) END_MESSAGE_MAP() // CZipDlg 消息处理程序 BOOL CZipDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // 打开zip文件 zip* pZip = zip_open("test.zip", 0, NULL); if (pZip == NULL) { AfxMessageBox(_T("无法打开zip文件!")); EndDialog(IDCANCEL); return FALSE; } // 获取文件总数并设置进度条范围 int nFileCount = zip_get_num_files(pZip); m_progress.SetRange(0, nFileCount); // 遍历zip文件中的每个文件,并解压它们 for (int i = 0; i < nFileCount; i++) { // 获取文件名 const char* pszFileName = zip_get_name(pZip, i, ZIP_FL_ENC_RAW); // 打开文件 zip_file* pFile = zip_fopen_index(pZip, i, 0); if (pFile == NULL) { AfxMessageBox(_T("无法打开文件!")); EndDialog(IDCANCEL); return FALSE; } // 创建新文件 FILE* pNewFile; fopen_s(&pNewFile, pszFileName, "wb"); if (pNewFile == NULL) { AfxMessageBox(_T("无法创建新文件!")); EndDialog(IDCANCEL); return FALSE; } // 解压文件 char buffer[ZIP_BUFFER_SIZE]; int nRead; while ((nRead = zip_fread(pFile, buffer, ZIP_BUFFER_SIZE)) > 0) { fwrite(buffer, nRead, 1, pNewFile); } // 关闭文件 fclose(pNewFile); zip_fclose(pFile); // 更新进度条位置 m_progress.SetPos(i + 1); } // 关闭zip文件 zip_close(pZip); AfxMessageBox(_T("解压完成!")); EndDialog(IDOK); return TRUE; } ``` 在这个示例中,我们在OnInitDialog函数中执行解压过程,并在每次解压一个文件时更新进度条的位置。请注意,此示例中的解压操作是同步的,因此应用程序将在解压完成之前被阻塞。如果你需要异步解压操作,请参考MFC提供的其他控件和线程技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值