ZipZilb.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include "ZipZilb.h"
  2. #include "libtoolkit/path.h"
  3. bool CreateZipFromFile(string srcFileName, string zipFileName)
  4. {
  5. if (srcFileName.empty() || srcFileName.length() == 0 ||
  6. zipFileName.empty() || zipFileName.length() == 0) {
  7. Dbg("压缩文件参数为空:");
  8. return false;
  9. }
  10. int pos = srcFileName.find_last_of(SPLIT_SLASH);
  11. /*
  12. #ifdef RVC_OS_WIN
  13. int pos = srcFileName.find_last_of('\\');
  14. #else
  15. int pos = srcFileName.find_last_of('/');
  16. #endif
  17. */
  18. if (pos < 0) {
  19. Dbg("文件路径不对:%s",srcFileName.c_str());
  20. return false;
  21. }
  22. string strName(srcFileName.substr(pos + 1));
  23. zipFile newZipFile = zipOpen(zipFileName.c_str(), APPEND_STATUS_CREATE); //创建zip文件
  24. if (newZipFile == NULL)
  25. {
  26. Dbg("无法创建zip文件!");
  27. return false;
  28. }
  29. //
  30. //压缩文件
  31. if (AddFileToZip(newZipFile, strName.c_str(), srcFileName.c_str()) != 0)
  32. {
  33. Dbg("压缩文件失败");
  34. zipClose(newZipFile, NULL);
  35. if (remove(zipFileName.c_str()) != 0) {
  36. Dbg("删除临时压缩文件失败");
  37. }
  38. return false;
  39. }
  40. //释放文件
  41. zipClose(newZipFile, NULL);
  42. Dbg("文件压缩成功: %s", zipFileName.c_str());
  43. return true;
  44. }
  45. bool AddFileToZip(zipFile zf, const char* fileNameInZip, const char* srcFile)
  46. {
  47. FILE* srcfp = NULL;
  48. //初始化写入zip的文件信息
  49. zip_fileinfo zi;
  50. zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
  51. zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
  52. zi.dosDate = 0;
  53. zi.internal_fa = 0;
  54. zi.external_fa = 0;
  55. //如果srcFile为空,加入空目录
  56. char new_file_name[256];
  57. memset(new_file_name, 0, sizeof(new_file_name));
  58. strcat(new_file_name, fileNameInZip);
  59. if (srcFile == NULL)
  60. {
  61. strcat(new_file_name, "/");
  62. }
  63. //在zip文件中创建新文件或文件夹
  64. int ret = zipOpenNewFileInZip(zf, new_file_name, &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION);
  65. if (ret != ZIP_OK)
  66. {
  67. if (srcFile != NULL) {
  68. Dbg("在zip文件中创建新文件失败: %s", srcFile);
  69. }
  70. else {
  71. Dbg("在zip文件中创建新目录失败: %s", new_file_name);
  72. }
  73. return false;
  74. }
  75. if (srcFile != NULL)
  76. {
  77. //打开源文件
  78. srcfp = fopen(srcFile, "rb+");
  79. if (srcfp == NULL)
  80. {
  81. Dbg("打开要往zip压缩的文件失败: %s", srcFile);
  82. zipCloseFileInZip(zf); //关闭zip中的新文件
  83. return false;
  84. }
  85. int fileLen = (int)GetFileLen(srcfp);
  86. //读入源文件并写入zip文件
  87. char buf[16 * 1024];
  88. int numBytes = 0;
  89. int sumWrite = 0;
  90. while (!feof(srcfp) && !ferror(srcfp))
  91. {
  92. numBytes = fread(buf, 1, sizeof(buf), srcfp);
  93. int ret = zipWriteInFileInZip(zf, buf, numBytes);
  94. if (ret != ZIP_OK) {
  95. Dbg("文件写入zip压缩包失败1: %s", srcFile);
  96. fclose(srcfp);
  97. zipCloseFileInZip(zf);
  98. return false;//写文件失败
  99. }
  100. sumWrite += numBytes;
  101. }
  102. //和原文件长度是否相同
  103. if (sumWrite != fileLen) {
  104. Dbg("文件写入zip压缩包失败,总长度不一致: %s", srcFile);
  105. fclose(srcfp);
  106. zipCloseFileInZip(zf);
  107. return false;//写文件失败
  108. }
  109. //关闭源文件
  110. fclose(srcfp);
  111. }
  112. //关闭zip文件
  113. zipCloseFileInZip(zf);
  114. return true;
  115. }
  116. long GetFileLen(FILE* _file)
  117. {
  118. long curPosit = ftell(_file), fileLen;
  119. fseek(_file, 0, SEEK_END);
  120. fileLen = ftell(_file);
  121. fseek(_file, curPosit, SEEK_SET);
  122. return fileLen;
  123. }