#include "XZipZilb.h" #include "path.h" #include "fileutil.h" bool CreateZipFromFile(string srcFileName, string zipFileName) { if (srcFileName.empty() || srcFileName.length() == 0 || zipFileName.empty() || zipFileName.length() == 0) { //Dbg("压缩文件参数为空:"); Dbg("XZipZilb zip param is null"); return false; } int pos = srcFileName.find_last_of(SPLIT_SLASH); if (pos < 0) { //Dbg("文件路径不对:%s",srcFileName.c_str()); Dbg("XZipZilb srcFileName path format is error:%s", srcFileName.c_str()); return false; } string strName(srcFileName.substr(pos + 1)); // does zip source file exist? //if (ExistsFileA(zipFileName)) { // remove(zipFileName.c_str(); //} zipFile newZipFile = zipOpen(zipFileName.c_str(), APPEND_STATUS_CREATE); //创建zip文件 if (newZipFile == NULL) { //Dbg("无法创建zip文件!"); Dbg("XZipZilb can't create zip file: %s", zipFileName.c_str()); return false; } //压缩文件 if (!AddFileToZip(newZipFile, strName.c_str(), srcFileName.c_str())) { //Dbg("压缩失败: %s",zipFileName.c_str()); Dbg("XZipZilb zip fail: %s", zipFileName.c_str()); zipClose(newZipFile, NULL); if (ExistsFileA(zipFileName.c_str())) { if (remove(zipFileName.c_str()) != 0) { //Dbg("删除临时压缩文件失败"); Dbg("XZipZilb delete temp zip file is error"); } } return false; } //释放文件 zipClose(newZipFile, NULL); //Dbg("压缩成功: %s", zipFileName.c_str()); Dbg("XZipZilb zip succ: %s", zipFileName.c_str()); return true; } bool AddFileToZip(zipFile zf, const char* fileNameInZip, const char* srcFile) { //Dbg("fileNameInZip %s : %s", fileNameInZip, srcFile); FILE* srcfp = NULL; //初始化写入zip的文件信息(后期写入文件修改日期等信息) zip_fileinfo zi; zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour = zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0; zi.dosDate = 0; zi.internal_fa = 0; zi.external_fa = 0; //如果srcFile为空,加入空目录 char new_file_name[256]; memset(new_file_name, 0, sizeof(new_file_name)); strcat(new_file_name, fileNameInZip); if (srcFile == NULL) { strcat(new_file_name, SPLIT_SLASH_STR); } //在zip文件中创建新文件或文件夹 int ret = zipOpenNewFileInZip(zf, new_file_name, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); if (ret != ZIP_OK) { if (srcFile != NULL) { //Dbg("在zip文件中创建新文件失败: %s", srcFile); Dbg("XZipZilb create file in zip fail: %s", srcFile); } else { //Dbg("在zip文件中创建新目录失败: %s", new_file_name); Dbg("XZipZilb create dir in zip fail: %s", new_file_name); } return false; } if (srcFile != NULL) { //打开源文件 srcfp = fopen(srcFile, "rb+"); if (srcfp == NULL) { //Dbg("打开要往zip压缩的文件失败: %s", srcFile); Dbg("XZipZilb open src file to zip is fail: %s", srcFile); zipCloseFileInZip(zf); //关闭zip中的新文件 return false; } int fileLen = (int)GetFileLen(srcfp); //读入源文件并写入zip文件 char buf[16 * 1024]; int numBytes = 0; int sumWrite = 0; while (!feof(srcfp) && !ferror(srcfp)) { numBytes = fread(buf, 1, sizeof(buf), srcfp); int ret = zipWriteInFileInZip(zf, buf, numBytes); if (ret != ZIP_OK) { Dbg("文件写入zip压缩包失败1: %s", srcFile); fclose(srcfp); zipCloseFileInZip(zf); return false;//写文件失败 } sumWrite += numBytes; } if (sumWrite != fileLen) { //Dbg("文件写入zip压缩包失败,总长度不一致: %s", srcFile); Dbg("XZipZilb write to zip file is error ,sumWrite is not equal to fileLen, %s", srcFile); fclose(srcfp); zipCloseFileInZip(zf); return false;//写文件失败 } //关闭源文件 fclose(srcfp); } //关闭zip文件 zipCloseFileInZip(zf); return true; } long GetFileLen(FILE* _file) { long curPosit = ftell(_file), fileLen; fseek(_file, 0, SEEK_END); fileLen = ftell(_file); fseek(_file, curPosit, SEEK_SET); return fileLen; }