// Updates specified files in zip void ZipFile::Update(String* FileSpec, UpdateOption UpdateWhen, Boolean AddNewFiles, Boolean RecurseSubdirectories, PathInclusion AddPathMethod) { // If destination zip file doesn't exist, we just perform an Add if (!File::Exists(fileName)) { if (AddNewFiles) Add(FileSpec, RecurseSubdirectories, AddPathMethod); return; } char* pszPassword = NULL; ZipFile* tempZipFile; OpenFileForUnzip(); // Just wrapping in a try/catch/finally to make sure unmanaged code allocations always get released and temp zip file gets removed try { // Create temporary zip file to hold update results tempZipFile = CreateTempZipFile(); // Get ANSI password, if one was provided if (password) if (password->get_Length()) pszPassword = StringToCharBuffer(password); String* fileSpec = Path::GetFileName(FileSpec); String* rootPath = JustPath(FileSpec, fileSpec); UpdateFilesInZip(tempZipFile, fileSpec, rootPath, rootPath->get_Length(), UpdateWhen, AddNewFiles, RecurseSubdirectories, AddPathMethod, pszPassword); // Now make the temp file the new zip file Close(); tempZipFile->Close(); File::Delete(fileName); File::Move(tempZipFile->fileName, fileName); } catch (CompressionException* ex) { // We just rethrow any errors back to user throw ex; } catch (Exception* ex) { throw ex; } __finally { if (pszPassword) free(pszPassword); // If everything went well, temp zip will no longer exist, but just in case we tidy up and delete the temp file... DeleteTempZipFile(tempZipFile); } // We'll reload the file list after update if requested... if (autoRefresh) Refresh(); }
// Removes specified files from zip void ZipFile::Remove(String* FileSpec, Boolean RecurseSubdirectories) { ZipFile* tempZipFile; OpenFileForUnzip(); // Just wrapping in a try/catch/finally to make sure temp zip file gets removed try { Regex* filePattern = GetFilePatternRegularExpression(FileSpec, caseSensitive); IEnumerator* filesEnum = files->GetEnumerator(); CompressedFile* file; // Create temporary zip file to hold remove results tempZipFile = CreateTempZipFile(); // Loop through compressed file collection while (filesEnum->MoveNext()) { file = static_cast<CompressedFile*>(filesEnum->Current); // We copy all files into destination zip file except those user requested to be removed... if (!filePattern->IsMatch(GetSearchFileName(FileSpec, file->get_FileName(), RecurseSubdirectories))) CopyFileInZip(file, this, tempZipFile, S"Remove Zip File"); } // Now make the temp file the new zip file Close(); tempZipFile->Close(); File::Delete(fileName); File::Move(tempZipFile->fileName, fileName); } catch (CompressionException* ex) { // We just rethrow any errors back to user throw ex; } catch (Exception* ex) { throw ex; } __finally { // If everything went well, temp zip will no longer exist, but just in case we tidy up and delete the temp file... DeleteTempZipFile(tempZipFile); } // We'll reload the file list after remove if requested... if (autoRefresh) Refresh(); }