Skip to content
DavidPierson edited this page Nov 2, 2010 · 3 revisions

How to use SharpZipLib to update Zip files

This page shows how to update an existing zip file. Contents may be added, overwritten or deleted.

Basic updating of a zip file

First example shows how to add or overwrite entries in a zip file on disk. This concentrates on the essentials.

using ICSharpCode.SharpZipLib.Zip;

public void UpdateExistingZip() {
	ZipFile zipFile = new ZipFile(@"c:\temp\existing.zip");

	// Must call BeginUpdate to start, and CommitUpdate at the end.
	zipFile.BeginUpdate();

	zipFile.Password = "whatever"; // Only if a password is wanted on the new entry

	// The "Add()" method will add or overwrite as necessary.
	// When the optional entryName parameter is omitted, the entry will be named
	// with the full folder path and without the drive e.g. "temp/folder/test1.txt".
	//
	zipFile.Add(@"c:\temp\folder\test1.txt");

	// Specify the entryName parameter to modify the name as it appears in the zip.
	//
	zipFile.Add(@"c:\temp\folder\test2.txt", "test2.txt");

	// Continue calling .Add until finished.

	// Both CommitUpdate and Close must be called.
	zipFile.CommitUpdate();
	zipFile.Close();
}

Updating a zip file in memory

Updating in memory is no more difficult than updating a disk file. The only real difference is setting IsStreamOwner.

// This will update a zip file contained in a memory stream.
public void UpdateZipInMemory(MemoryStream ms) {

	// The memorystream is expected to contain the complete zipfile
	ZipFile zipFile = new ZipFile(ms);

	zipFile.BeginUpdate();

	zipFile.Add(@"c:\temp\folder\test1.txt"); // Default naming
	zipFile.Add(@"c:\temp\folder\test2.txt", "test2.txt"); // Explicit naming
	// etc

	// Both CommitUpdate and Close must be called.
	zipFile.CommitUpdate();
	// Set this so that Close does not close the memorystream
	zipFile.IsStreamOwner = false;
	zipFile.Close();

	// Reposition to the start for the convenience of the caller.
	ms.Position = 0;
}
// This is a test harnesss to check that the update in memory is working.
//
public void CallingExample() {

	// Read a disk file into memory
	MemoryStream ms = new MemoryStream();
	FileStream fs = File.OpenRead(@"c:\temp\existing.zip");

	// Copying whole file into a byte array is not efficient. Better to use StreamUtils.Copy as shown below.
	byte[ ] bytes = new byte[fs.Length];
	fs.Read(bytes, 0, (int)fs.Length);
	fs.Close();
	ms.Write(bytes, 0, bytes.Length);

	// Do the update
	UpdateZipInMemory(ms);

	// Save the update to disk
	fs = File.Create(@"c:\temp\updated.zip");
	// This utility method copies from stream to stream.
	ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(ms, fs, new byte[4096]);
	fs.Close();
}

Back to Code Reference main page

Clone this wiki locally