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