XZipZilb.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "XZipZilb.h"
  2. #include "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. zi.dosDate = 0;
  59. zi.internal_fa = 0;
  60. zi.external_fa = 0;
  61. //如果srcFile为空,加入空目录
  62. char new_file_name[256];
  63. memset(new_file_name, 0, sizeof(new_file_name));
  64. strcat(new_file_name, fileNameInZip);
  65. if (srcFile == NULL)
  66. {
  67. strcat(new_file_name, SPLIT_SLASH_STR);
  68. }
  69. //在zip文件中创建新文件或文件夹
  70. int ret = zipOpenNewFileInZip(zf, new_file_name, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION);
  71. if (ret != ZIP_OK)
  72. {
  73. if (srcFile != NULL) {
  74. //Dbg("在zip文件中创建新文件失败: %s", srcFile);
  75. Dbg("XZipZilb create file in zip fail: %s", srcFile);
  76. }
  77. else {
  78. //Dbg("在zip文件中创建新目录失败: %s", new_file_name);
  79. Dbg("XZipZilb create dir in zip fail: %s", new_file_name);
  80. }
  81. return false;
  82. }
  83. if (srcFile != NULL)
  84. {
  85. //打开源文件
  86. srcfp = fopen(srcFile, "rb+");
  87. if (srcfp == NULL)
  88. {
  89. //Dbg("打开要往zip压缩的文件失败: %s", srcFile);
  90. Dbg("XZipZilb open src file to zip is fail: %s", srcFile);
  91. zipCloseFileInZip(zf); //关闭zip中的新文件
  92. return false;
  93. }
  94. int fileLen = (int)GetFileLen(srcfp);
  95. //读入源文件并写入zip文件
  96. char buf[16 * 1024];
  97. int numBytes = 0;
  98. int sumWrite = 0;
  99. while (!feof(srcfp) && !ferror(srcfp))
  100. {
  101. numBytes = fread(buf, 1, sizeof(buf), srcfp);
  102. int ret = zipWriteInFileInZip(zf, buf, numBytes);
  103. if (ret != ZIP_OK) {
  104. Dbg("文件写入zip压缩包失败1: %s", srcFile);
  105. fclose(srcfp);
  106. zipCloseFileInZip(zf);
  107. return false;//写文件失败
  108. }
  109. sumWrite += numBytes;
  110. }
  111. if (sumWrite != fileLen) {
  112. //Dbg("文件写入zip压缩包失败,总长度不一致: %s", srcFile);
  113. Dbg("XZipZilb write to zip file is error ,sumWrite is not equal to fileLen, %s", srcFile);
  114. fclose(srcfp);
  115. zipCloseFileInZip(zf);
  116. return false;//写文件失败
  117. }
  118. //关闭源文件
  119. fclose(srcfp);
  120. }
  121. //关闭zip文件
  122. zipCloseFileInZip(zf);
  123. return true;
  124. }
  125. long GetFileLen(FILE* _file)
  126. {
  127. long curPosit = ftell(_file), fileLen;
  128. fseek(_file, 0, SEEK_END);
  129. fileLen = ftell(_file);
  130. fseek(_file, curPosit, SEEK_SET);
  131. return fileLen;
  132. }