System.IO.Compression是.Net 2.0裡與壓縮有關的命名空間,但是使用起來並不是很方便。使用第3方庫ziplib可以很方便地進行壓縮類的操作。
從[1]
下載動態庫,然後在工程裡Add Reference,把ICSharpCode.SharpZipLib.dll加進去。
在代碼來建立一個zip包的例子如下(摘自ziplib sample code)
using
ICSharpCode.SharpZipLib.Checksums;
using
ICSharpCode.SharpZipLib.Zip;
using
ICSharpCode.SharpZipLib.GZip;
把指定目錄下的所有檔案壓縮到一個zip包裡
private
void ZipTheReports()
{
string
year = System.DateTime.Today.Year.ToString();
string
month = System.DateTime.Today.Month.ToString();
string
days = System.DateTime.Today.Day.ToString();
string[]
filenames = Directory.GetFiles(curDir);
string
zipFileName = "Rplan Report " +
year + month + days + ".zip";
string
zipAbsPath = this.curDir + zipFileName;
zipRelativePath = zipFileName;
Crc32
crc = new Crc32();
ZipOutputStream
s = new ZipOutputStream(File.Create(zipAbsPath)); // 指定zip檔案的絕對路徑,包括檔案名稱
s.SetLevel(6); // 0 - store only to 9 - means best compression
foreach
(string file in
filenames)
{
FileStream
fs = File.OpenRead(file); // 檔案的絕對路徑,包括檔案名稱
byte[] buffer
= new byte[fs.Length];
fs.Read(buffer, 0,
buffer.Length);
ZipEntry
entry = new ZipEntry(extractFileName(file));
//這裡ZipEntry的參數必須是相對路徑名,表示檔案在zip文檔裡的相對路徑
entry.DateTime = DateTime.Now;
// set Size
and the crc, because the information
//
about the size and crc should be stored in the header
// if
it is not set it is automatically written in the footer.
//
(in this case size == crc == -1 in the header)
//
Some ZIP programs have problems with zip files that don't store
//
the size and crc in the header.
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);
s.Write(buffer, 0,
buffer.Length);
}
s.Finish();
s.Close();
}
// e.g. convert c:\\temp\test.xls to test.xls
private string extractFileName(string filePath)
{
int
index1 = filePath.LastIndexOf("\\");
string
fileName =
filePath.Substring(index1+1);
return
fileName;
}
Reference
1.ZipLib
http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx
A port of zlib library to C#. Its license allows developers
to include this library in commercial, closed-source applications.
2. System.IO.Compression Namespace
http://msdn2.microsoft.com/en-us/library/system.io.compression.aspx
DeflateStream Class
http://msdn2.microsoft.com/en-us/library/system.io.compression.deflatestream.aspx
3.Compression
Application Sample
http://msdn2.microsoft.com/en-us/library/ywf6dxhx.aspx
This sample demonstrates compression capabilities available
in the .NET Framework. It builds a Windows Forms application that employs the
GZipStream and DeflateStream types to compress and decompress files. The sample
also introduces several types that are new in the .NET Framework version 2.0.
4. Using the Zip Classes in the J# Class Libraries to Compress
Files and Data with C#
http://msdn.microsoft.com/msdnmag/issues/03/06/ZipCompression/default.aspx