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