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 } }
发表回复