Search code examples
c#sharpziplib

Creating and updating a zipfile


Following the documentation, I'm having an extremely difficult time getting this to work. Using ZipFile I want to create a zip in memory and then be able to update it. On each successive call to update the, the zip reports that it has 0 entries.

What am I doing wrong?

    public void AddFile(MemoryStream zipStream, Stream file, string fileName)
    {
        //First call to this zipStream is just an empty stream
        var zip = ZipFile.Create(zipStream);

        zip.BeginUpdate();
        zip.Add(new ZipDataSource(file), fileName);
        zip.CommitUpdate();
        zip.IsStreamOwner = false;
        zip.Close();

        zipStream.Position = 0;
    }

    public Stream GetFile(Stream zipStream, string pathAndName)
    {
        var zip = ZipFile.Create(zipStream);
        zip.IsStreamOwner = false;

        foreach (ZipEntry hi in zip) //count is 0
        {

        }
        var entry = zip.GetEntry(pathAndName);

        return entry == null ? null : zip.GetInputStream(entry);
    }

The custom data source

        public class ZipDataSource : IStaticDataSource
        {
        private Stream _stream;

        public ZipDataSource(Stream stream)
        {
            _stream = stream;
        }

        public Stream GetSource()
        {
            _stream.Position = 0;
            return _stream;
        }

Solution

  • ZipFile.Create(zipStream) is not just a convenient static accessor like anyone would think. If you're going to use that only use it for the very first time you're creating a zip. When opening up an existing zip you need to use var zip = new ZipFile(zipStream).

    I've personally had many issues in the past with this library and would suggest that anyone looking for a good zip library to choose something other than icsharpziplib... The API just plain sucks.