XZipZilb.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include "XZipZilb.h"
  2. #include "libtoolkit/path.h"
  3. #include "fileutil.h"
  4. bool CreateZipFromFile(string srcFileName, string zipFileName)
  5. {
  6. if (srcFileName.empty() || srcFileName.length() == 0 ||
  7. zipFileName.empty() || zipFileName.length() == 0) {
  8. //Dbg("压缩文件参数为空:");
  9. Dbg("XZipZilb zip param is null");
  10. return false;
  11. }
  12. int pos = srcFileName.find_last_of(SPLIT_SLASH);
  13. if (pos < 0) {
  14. //Dbg("文件路径不对:%s",srcFileName.c_str());
  15. Dbg("XZipZilb srcFileName path format is error:%s", srcFileName.c_str());
  16. return false;
  17. }
  18. string strName(srcFileName.substr(pos + 1));
  19. // does zip source file exist?
  20. //if (ExistsFileA(zipFileName)) {
  21. // remove(zipFileName.c_str();
  22. //}
  23. zipFile newZipFile = zipOpen(zipFileName.c_str(), APPEND_STATUS_CREATE); //创建zip文件
  24. if (newZipFile == NULL)
  25. {
  26. //Dbg("无法创建zip文件!");
  27. Dbg("XZipZilb can't create zip file: %s", zipFileName.c_str());
  28. return false;
  29. }
  30. //压缩文件
  31. if (!AddFileToZip(newZipFile, strName.c_str(), srcFileName.c_str()))
  32. {
  33. //Dbg("压缩失败: %s",zipFileName.c_str());
  34. Dbg("XZipZilb zip fail: %s", zipFileName.c_str());
  35. zipClose(newZipFile, NULL);
  36. if (ExistsFileA(zipFileName.c_str())) {
  37. if (remove(zipFileName.c_str()) != 0) {
  38. //Dbg("删除临时压缩文件失败");
  39. Dbg("XZipZilb delete temp zip file is error");
  40. }
  41. }
  42. return false;
  43. }
  44. //释放文件
  45. zipClose(newZipFile, NULL);
  46. //Dbg("压缩成功: %s", zipFileName.c_str());
  47. Dbg("XZipZilb zip succ: %s", zipFileName.c_str());
  48. return true;
  49. }
  50. bool AddFileToZip(zipFile zf, const char* fileNameInZip, const char* srcFile)
  51. {
  52. //Dbg("fileNameInZip %s : %s", fileNameInZip, srcFile);
  53. FILE* srcfp = NULL;
  54. //初始化写入zip的文件信息(后期写入文件修改日期等信息)
  55. zip_fileinfo zi;
  56. zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
  57. zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
  58. if (!insertZipFileEditTime(&zi, srcFile)) {
  59. //插入文件修改时间失败
  60. Dbg("XZipZilb create file editTime in zip fail: %s", srcFile);
  61. }
  62. zi.dosDate = 0;
  63. zi.internal_fa = 0;
  64. zi.external_fa = 0;
  65. //如果srcFile为空,加入空目录
  66. char new_file_name[256];
  67. memset(new_file_name, 0, sizeof(new_file_name));
  68. strcat(new_file_name, fileNameInZip);
  69. if (srcFile == NULL)
  70. {
  71. strcat(new_file_name, SPLIT_SLASH_STR);
  72. }
  73. //在zip文件中创建新文件或文件夹
  74. int ret = zipOpenNewFileInZip(zf, new_file_name, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION);
  75. if (ret != ZIP_OK)
  76. {
  77. if (srcFile != NULL) {
  78. //Dbg("在zip文件中创建新文件失败: %s", srcFile);
  79. Dbg("XZipZilb create file in zip fail: %s", srcFile);
  80. }
  81. else {
  82. //Dbg("在zip文件中创建新目录失败: %s", new_file_name);
  83. Dbg("XZipZilb create dir in zip fail: %s", new_file_name);
  84. }
  85. return false;
  86. }
  87. if (srcFile != NULL)
  88. {
  89. //打开源文件
  90. srcfp = fopen(srcFile, "rb+");
  91. if (srcfp == NULL)
  92. {
  93. //Dbg("打开要往zip压缩的文件失败: %s", srcFile);
  94. Dbg("XZipZilb open src file to zip is fail: %s", srcFile);
  95. zipCloseFileInZip(zf); //关闭zip中的新文件
  96. return false;
  97. }
  98. int fileLen = (int)GetFileLen(srcfp);
  99. if (fseek(srcfp, 0, SEEK_SET)!=0) {
  100. Dbg("XZipZilb fseek set begin fail: %s", srcFile);
  101. fclose(srcfp);
  102. zipCloseFileInZip(zf); //关闭zip中的新文件
  103. return false;
  104. }
  105. //读入源文件并写入zip文件
  106. //char buf[16 * 1024];
  107. unsigned char* buf = new unsigned char[16*1024];
  108. int numBytes = 0;
  109. int sumWrite = 0;
  110. while (!feof(srcfp) && !ferror(srcfp))
  111. {
  112. numBytes = fread(buf, 1, 16 * 1024, srcfp);
  113. if (numBytes == 0) {
  114. continue;
  115. }
  116. int ret = zipWriteInFileInZip(zf, buf, numBytes);
  117. if (ret != ZIP_OK) {
  118. Dbg("文件写入zip压缩包失败1: %s", srcFile);
  119. fclose(srcfp);
  120. zipCloseFileInZip(zf);
  121. delete[] buf;
  122. return false;//写文件失败
  123. }
  124. sumWrite += numBytes;
  125. }
  126. delete[] buf;
  127. if (sumWrite != fileLen) {
  128. //Dbg("文件写入zip压缩包失败,总长度不一致: %s", srcFile);
  129. Dbg("XZipZilb write to zip file is error ,sumWrite is not equal to fileLen, %s", srcFile);
  130. fclose(srcfp);
  131. zipCloseFileInZip(zf);
  132. return false;//写文件失败
  133. }
  134. //关闭源文件
  135. fclose(srcfp);
  136. }
  137. //关闭zip文件
  138. zipCloseFileInZip(zf);
  139. return true;
  140. }
  141. long GetFileLen(FILE* _file)
  142. {
  143. long curPosit = ftell(_file), fileLen;
  144. fseek(_file, 0, SEEK_END);
  145. fileLen = ftell(_file);
  146. fseek(_file, curPosit, SEEK_SET);
  147. return fileLen;
  148. }
  149. bool insertZipFileEditTime(zip_fileinfo* zi, const char* srcFile)
  150. {
  151. #ifdef RVC_OS_WIN
  152. WIN32_FILE_ATTRIBUTE_DATA attr;
  153. SYSTEMTIME filest;
  154. FILETIME fttmp;
  155. if (GetFileAttributesExA(srcFile, GetFileExInfoStandard, &attr))
  156. {
  157. if (FileTimeToLocalFileTime(&attr.ftLastWriteTime, &fttmp)) {
  158. if (FileTimeToSystemTime(&fttmp, &filest)) {
  159. zi->tmz_date.tm_sec = filest.wSecond;
  160. zi->tmz_date.tm_min = filest.wMinute;
  161. zi->tmz_date.tm_hour = filest.wHour;
  162. zi->tmz_date.tm_mday = filest.wDay;
  163. zi->tmz_date.tm_mon = filest.wMonth - 1;
  164. zi->tmz_date.tm_year = filest.wYear - 1980;
  165. return true;
  166. }
  167. }
  168. }
  169. return false;
  170. #else
  171. struct stat attr_of_src;
  172. if (lstat(srcFile, &attr_of_src) == 0)
  173. {
  174. time_t t = attr_of_src.st_mtime;
  175. tm lt = { 0 };
  176. localtime_r(&t, &lt);
  177. zi->tmz_date.tm_sec = lt.tm_sec;
  178. zi->tmz_date.tm_min = lt.tm_min;
  179. zi->tmz_date.tm_hour = lt.tm_hour;
  180. zi->tmz_date.tm_mday = lt.tm_mday;
  181. zi->tmz_date.tm_mon = lt.tm_mon;
  182. zi->tmz_date.tm_year = lt.tm_year+1900-1980;
  183. return true;
  184. }
  185. return false;
  186. #endif
  187. }