Imported from ScrewTurn Wiki page SharpZipLib_Updating.00000
Родитель
8ccf198bfc
Коммит
efd1359441
|
@ -0,0 +1,93 @@
|
||||||
|
**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|Code Reference]]
|
Загрузка…
Ссылка в новой задаче