Задача: Утилиты
Исходник: zip-архивы с помощью ZLib, язык: C++ [code #544, hits: 14427]
автор: - [добавлен: 17.12.2007]
  1. // ПРИМЕР >>
  2. #include "stdafx.h"
  3. #include "SimpleZipArchive.h"
  4.  
  5. int main(int argc, char* argv[])
  6. {
  7. CSimpleZipArchive zip("d:\\_myzip.zip");
  8.  
  9. zip.AddFile("d:\\file1.txt");
  10. zip.AddFile("d:\\file2.doc");
  11. zip.AddFile("d:\\file3.xls");
  12. zip.RemoveFile("d:\\file2.doc");
  13.  
  14. zip.ZipIt();
  15.  
  16. return 0;
  17. }
  18.  
  19. // КЛАСС >>
  20. #if !defined(_SIMPLEZIPARCHIVE_H_INCLUDED_)
  21. #define _SIMPLEZIPARCHIVE_H_INCLUDED_
  22.  
  23. #if _MSC_VER > 1000
  24. #pragma once
  25. #endif // _MSC_VER > 1000
  26.  
  27. #pragma comment(lib, ".\\zlib\\zlib.lib")
  28.  
  29. #include ".\zlib\zip.h"
  30. #include <sys/stat.h>
  31. #include <time.h>
  32. #include <map>
  33. #include <string>
  34. using namespace std;
  35.  
  36. #define READ_BUFFER_SIZE 65535
  37.  
  38.  
  39. //Спасибо тов. Bell-у за наше счастливое детство :)
  40. struct CaseInsensitiveLess : public binary_function<string, string, bool>
  41. {
  42. bool operator()(const string &s1, const string &s2) const
  43. {
  44. return stricmp(s1.c_str(), s2.c_str()) < 0;
  45. }
  46. };
  47.  
  48. typedef map<string, bool, CaseInsensitiveLess> STRCI_MAP;
  49.  
  50.  
  51. class CSimpleZipArchive
  52. {
  53. public:
  54. CSimpleZipArchive(const char* _zipName = NULL) { SetZipFileName(_zipName); }
  55.  
  56. virtual ~CSimpleZipArchive() {}
  57.  
  58. void SetZipFileName(const char* _zipName)
  59. {
  60. if (_zipName && 0 != *_zipName)
  61. m_ZipFileName = _zipName;
  62. }
  63.  
  64. const char* GetZipFileName() const { return m_ZipFileName.c_str(); }
  65.  
  66. bool RemoveFile(const char* _fileName)
  67. {
  68. if (!_fileName || 0 == *_fileName) return false;
  69. STRCI_MAP::iterator findIter = m_Files.find(string(_fileName));
  70. if (findIter != m_Files.end())
  71. {
  72. m_Files.erase(findIter);
  73. return true;
  74. }
  75. else
  76. return false;
  77. }
  78.  
  79. bool AddFile(const char* _fileName)
  80. {
  81. if (!_fileName || 0 == *_fileName) return false;
  82. pair<STRCI_MAP::iterator, bool> result =
  83. m_Files.insert(STRCI_MAP::value_type(string(_fileName), true));
  84. return result.second;
  85. }
  86.  
  87. bool ZipIt() const
  88. {
  89. bool result = false;
  90. if ( 0 == m_Files.size()) return result;
  91.  
  92. STRCI_MAP::const_iterator Iter = m_Files.begin();
  93. zipFile zipfile = zipOpen(m_ZipFileName.c_str(), 0);
  94. if (zipfile != NULL)
  95. {
  96. while (Iter != m_Files.end())
  97. {
  98. result = false;
  99. const char* srcFullFileName = Iter->first.c_str();
  100. const char* p = strrchr(srcFullFileName, '\\');
  101. const char* srcFileName = (NULL == p) ? srcFullFileName : p + 1;
  102.  
  103. char read_buf[READ_BUFFER_SIZE];
  104. FILE* file = fopen(srcFullFileName, "rb");
  105. if (file != NULL)
  106. {
  107. zip_fileinfo zfileinfo = {0};
  108. struct _stat file_stat = {0};
  109. _fstat(_fileno(file), &file_stat);
  110. struct tm* file_time = localtime(&file_stat.st_mtime);
  111. tm_zip* zip_time = &zfileinfo.tmz_date;
  112. memcpy(zip_time, file_time, sizeof(tm_zip));
  113.  
  114. int compression = Z_BEST_COMPRESSION;
  115. if ( ZIP_OK == zipOpenNewFileInZip(zipfile, srcFileName,
  116. &zfileinfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, compression))
  117. {
  118. while(!feof(file))
  119. {
  120. result = false;
  121. size_t count = fread( read_buf, sizeof(char), READ_BUFFER_SIZE, file );
  122. if(!ferror(file))
  123. {
  124. if ( ZIP_OK == zipWriteInFileInZip(zipfile, read_buf, count))
  125. {
  126. result = true;
  127. continue;
  128. }
  129. else break;
  130. }else break;
  131. }
  132. result = result && (Z_OK == zipCloseFileInZip(zipfile));
  133. }
  134. result = result && (0 == fclose(file));
  135. }
  136. (result) ? Iter++ : Iter = m_Files.end();
  137. }
  138. result = result && (Z_OK == zipClose(zipfile, NULL));
  139. }
  140. return result;
  141. }
  142.  
  143. private:
  144. STRCI_MAP m_Files;
  145. string m_ZipFileName;
  146. };
  147.  
  148. #endif // !defined(_SIMPLEZIPARCHIVE_H_INCLUDED_)
Понадобилось создавать zip-архивы с помощью библиотеки <a href="http://www.gzip.org/zlib/" class="link">ZLib</a>. Решил поделиться результатами своих изысканий, может кому и сгодится. Код приводится без всяких претензий на полноту и оригинальность, так... чтоб было с чего начать. Извиняюсь за "расширенную" индикацию ошибок в лице return false , если понадобится, дополнить труда не составит.

http://rsdn.ru/forum/Message.aspx?mid=220804&only=1

+добавить реализацию