bool ZipWrapper::AddFolderToZip(const std::tstring& sFilename) { WIN32_FIND_DATA fd; HANDLE hFile = FindFirstFile(CStdString(sFilename + _T("\\*.*")).c_str(), &fd); if (hFile == INVALID_HANDLE_VALUE) return false; while (FindNextFile(hFile, &fd)) { std::tstring sFile = fd.cFileName; if (sFile.compare(_T("..")) == 0) continue; if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) AddFolderToZip(sFilename + _T("\\") + fd.cFileName); else AddFileToZip(sFilename + _T("\\") + fd.cFileName); } FindClose(hFile); return true; }
bool ZipWrapper::AddFolderToZipA(const std::string& sFolder) { return AddFolderToZip(CStdString(sFolder)); }
bool CZipper::AddFolderToZip(LPCTSTR szFolderPath, bool bIgnoreFilePath) { if (!m_uzFile) return FALSE; m_info.nFolderCount++; // if the path is relative then we need to append the root before opening char szFullPath[MAX_PATH]; lstrcpy(szFullPath, szFolderPath); PrepareSourcePath(szFullPath); // always add folder first // save file attributes zip_fileinfo zfi; zfi.internal_fa = 0; zfi.external_fa = ::GetFileAttributes(szFullPath); SYSTEMTIME st; // GetLastModified(szFullPath, st, TRUE); zfi.dosDate = 0; zfi.tmz_date.tm_year = st.wYear; zfi.tmz_date.tm_mon = st.wMonth - 1; zfi.tmz_date.tm_mday = st.wDay; zfi.tmz_date.tm_hour = st.wHour; zfi.tmz_date.tm_min = st.wMinute; zfi.tmz_date.tm_sec = st.wSecond; // if the folder is a fullpath then remove the root path bit char szFolderName[MAX_PATH] = ""; if (bIgnoreFilePath) { _splitpath(szFullPath, NULL, NULL, szFolderName, NULL); } else { // check the root can be found if (0 != _strnicmp(szFullPath, m_szRootFolder, lstrlen(m_szRootFolder))) return false; // else lstrcpy(szFolderName, szFullPath + lstrlen(m_szRootFolder)); } // folders are denoted by a trailing '\\' lstrcat(szFolderName, "\\"); // open the file in the zip making sure we remove any leading '\' int nRet = zipOpenNewFileInZip(m_uzFile, szFolderName, &zfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); zipCloseFileInZip(m_uzFile); // build searchspec char szDrive[_MAX_DRIVE], szFolder[MAX_PATH], szName[_MAX_FNAME]; _splitpath(szFullPath, szDrive, szFolder, szName, NULL); lstrcat(szFolder, szName); char szSearchSpec[MAX_PATH]; _makepath(szSearchSpec, szDrive, szFolder, "*", "*"); WIN32_FIND_DATA finfo; HANDLE hSearch = FindFirstFile(szSearchSpec, &finfo); if (hSearch != INVALID_HANDLE_VALUE) { do { if (finfo.cFileName[0] != '.') { char szItem[MAX_PATH]; _makepath(szItem, szDrive, szFolder, finfo.cFileName, NULL); if (finfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { AddFolderToZip(szItem, bIgnoreFilePath); } else AddFileToZip(szItem, bIgnoreFilePath); } } while (FindNextFile(hSearch, &finfo)); FindClose(hSearch); } return TRUE; }