使用ICSharpCode.SharpZipLib在现有Zip文件中添加文件的方法

ICSharpCode.SharpZipLib是一个操作压缩文件的类库。网上使用这个类库在Zip文件中添加文件的方法主要都是使用ZipOutputStream类在Zip中添加文件,可是使用这种方法有个很大的缺点,就是会把Zip文件原有的内容覆盖掉,只适合新建Zip文件。昨天需要把内存中的内容写到一个Zip文件中的一个文件里,所以研究了一下,发现ZipFile.Add方法可以满足这个需求,这个方法有8个重载,我用的是void Add(IStaticDataSource,string)这个重载。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            //准备写入内容
            MemoryStream contentStream = new MemoryStream();
            StreamWriter contentWriter = new StreamWriter(contentStream);
            contentWriter.WriteLine("Test");
            contentWriter.Flush();
            contentStream.Seek(0, SeekOrigin.Begin);

            string zipFilename = "test.zip";

            FileStream zipStream = null;
            ZipFile zipFile = null;
            try
            {
                if (!File.Exists(zipFilename))
                {
                    zipStream = File.Open(zipFilename, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
                    zipFile = ZipFile.Create(zipStream);
                }
                else
                {
                    zipStream = File.Open(zipFilename, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
                    zipFile = new ZipFile(zipStream);
                }
                zipFile.BeginUpdate();
                zipFile.Add(new StreamStaticDataSource(contentStream), DateTime.Now.ToString("HHmmss") + ".txt");
            }
            finally
            {
                if (zipFile != null)
                {
                    if (zipFile.IsUpdating)
                        zipFile.CommitUpdate();
                    zipFile.Close();
                }
                if (zipStream != null)
                    zipStream.Close();
            }
        }
    }

    public class StreamStaticDataSource : IStaticDataSource
    {
        private Stream _stream;

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

        #region IStaticDataSource Members

        public Stream GetSource()
        {
            return _stream;
        }

        #endregion
    }
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注