XZipZilb.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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. //读入源文件并写入zip文件
  100. //char buf[16 * 1024];
  101. unsigned char* buf = new unsigned char[16*1024];
  102. int numBytes = 0;
  103. int sumWrite = 0;
  104. while (!feof(srcfp) && !ferror(srcfp))
  105. {
  106. numBytes = fread(buf, 1, sizeof(buf), srcfp);
  107. int ret = zipWriteInFileInZip(zf, buf, numBytes);
  108. if (ret != ZIP_OK) {
  109. Dbg("文件写入zip压缩包失败1: %s", srcFile);
  110. fclose(srcfp);
  111. zipCloseFileInZip(zf);
  112. delete[] buf;
  113. return false;//写文件失败
  114. }
  115. sumWrite += numBytes;
  116. }
  117. delete[] buf;
  118. if (sumWrite != fileLen) {
  119. //Dbg("文件写入zip压缩包失败,总长度不一致: %s", srcFile);
  120. Dbg("XZipZilb write to zip file is error ,sumWrite is not equal to fileLen, %s", srcFile);
  121. fclose(srcfp);
  122. zipCloseFileInZip(zf);
  123. return false;//写文件失败
  124. }
  125. //关闭源文件
  126. fclose(srcfp);
  127. }
  128. //关闭zip文件
  129. zipCloseFileInZip(zf);
  130. return true;
  131. }
  132. long GetFileLen(FILE* _file)
  133. {
  134. long curPosit = ftell(_file), fileLen;
  135. fseek(_file, 0, SEEK_END);
  136. fileLen = ftell(_file);
  137. fseek(_file, curPosit, SEEK_SET);
  138. return fileLen;
  139. }
  140. bool insertZipFileEditTime(zip_fileinfo* zi, const char* srcFile)
  141. {
  142. #ifdef RVC_OS_WIN
  143. WIN32_FILE_ATTRIBUTE_DATA attr;
  144. SYSTEMTIME filest;
  145. FILETIME fttmp;
  146. if (GetFileAttributesExA(srcFile, GetFileExInfoStandard, &attr))
  147. {
  148. if (FileTimeToLocalFileTime(&attr.ftLastWriteTime, &fttmp)) {
  149. if (FileTimeToSystemTime(&fttmp, &filest)) {
  150. zi->tmz_date.tm_sec = filest.wSecond;
  151. zi->tmz_date.tm_min = filest.wMinute;
  152. zi->tmz_date.tm_hour = filest.wHour;
  153. zi->tmz_date.tm_mday = filest.wDay;
  154. zi->tmz_date.tm_mon = filest.wMonth - 1;
  155. zi->tmz_date.tm_year = filest.wYear - 1980;
  156. return true;
  157. }
  158. }
  159. }
  160. return false;
  161. #else
  162. struct stat attr_of_src;
  163. if (lstat(srcFile, &attr_of_src) == 0)
  164. {
  165. time_t t = attr_of_src.st_mtime;
  166. tm lt = { 0 };
  167. localtime_r(&t, &lt);
  168. zi->tmz_date.tm_sec = lt.tm_sec;
  169. zi->tmz_date.tm_min = lt.tm_min;
  170. zi->tmz_date.tm_hour = lt.tm_hour;
  171. zi->tmz_date.tm_mday = lt.tm_mday;
  172. zi->tmz_date.tm_mon = lt.tm_mon;
  173. zi->tmz_date.tm_year = lt.tm_year+1900-1980;
  174. return true;
  175. }
  176. return false;
  177. #endif
  178. }