diff options
author | Kirill Zhdanovich <kzhdanovich@gmail.com> | 2013-01-22 20:54:50 +0400 |
---|---|---|
committer | Alex Zolotarev <alex@maps.me> | 2015-09-23 01:49:07 +0300 |
commit | 6054e188026f65c3c39ae4900fef9d5e0a165d3f (patch) | |
tree | c0ec15fc29e14f83ef63659bb317d89998149378 /coding/zip_creator.cpp | |
parent | 92ecb5fd773334d12179e1806878a0563b503a34 (diff) |
Function for zipping file from path to path.
Zip file tests.
Diffstat (limited to 'coding/zip_creator.cpp')
-rw-r--r-- | coding/zip_creator.cpp | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/coding/zip_creator.cpp b/coding/zip_creator.cpp new file mode 100644 index 0000000000..f761df3a2b --- /dev/null +++ b/coding/zip_creator.cpp @@ -0,0 +1,73 @@ +#include "zip_creator.hpp" + +#include "../../coding/internal/file_data.hpp" + +#include "../../std/vector.hpp" +#include "../../std/iostream.hpp" +#include "../../std/ctime.hpp" + +#include "../../3party/zlib/contrib/minizip/zip.h" + + +class ZipHandle +{ +public: + zipFile m_zipFile; + ZipHandle(string const & filePath) + { + m_zipFile = zipOpen(filePath.c_str(), 0); + } + ~ZipHandle() + { + if (m_zipFile) + zipClose(m_zipFile, NULL); + } +}; + +namespace +{ +void CreateTMZip(tm_zip & res) +{ + time_t rawtime; + struct tm * timeinfo; + time ( &rawtime ); + timeinfo = localtime ( &rawtime ); + res.tm_sec = timeinfo->tm_sec; + res.tm_min = timeinfo->tm_min; + res.tm_hour = timeinfo->tm_hour; + res.tm_mday = timeinfo->tm_mday; + res.tm_mon = timeinfo->tm_mon; + res.tm_year = timeinfo->tm_year; +} +} + +bool createZipFromPathDeflatedAndDefaultCompression(string const & filePath, string const & zipFilePath) +{ + + ZipHandle zip(zipFilePath); + if (!zip.m_zipFile) + return false; + zip_fileinfo zipInfo = { 0 }; + CreateTMZip(zipInfo.tmz_date); + if (zipOpenNewFileInZip (zip.m_zipFile, filePath.c_str(), &zipInfo, NULL, 0, NULL, 0, "ZIP from MapsWithMe", Z_DEFLATED, Z_DEFAULT_COMPRESSION) < 0) + return false; + + my::FileData f(filePath, my::FileData::OP_READ); + + size_t const bufSize = 512 * 1024; + vector<char> buffer(bufSize); + size_t const fileSize = f.Size(); + size_t currSize = 0; + + while (currSize < fileSize) + { + size_t toRead = fileSize - currSize; + if (toRead > bufSize) + toRead = bufSize; + f.Read(currSize, &buffer[0], toRead); + if (ZIP_OK != zipWriteInFileInZip (zip.m_zipFile, &buffer[0], toRead)) + return false; + currSize += toRead; + } + return true; +} |