在C#中利用SharpZipLib进行文件的压缩和解压缩
我在做項(xiàng)目的時(shí)候需要將文件進(jìn)行壓縮和解壓縮,于是就從http://www.icsharpcode.net下載了關(guān)于壓縮和解壓縮的源碼,但是下載下來(lái)后,面對(duì)這么多的代碼,一時(shí)不知如何下手。只好耐下心來(lái),慢慢的研究,總算找到了門(mén)路。針對(duì)自己的需要改寫(xiě)了文件壓縮和解壓縮的兩個(gè)類(lèi),分別為ZipClass和UnZipClass。其中碰到了不少困難,就決定寫(xiě)出來(lái)壓縮和解壓的程序后,一定把源碼貼出來(lái)共享,讓首次接觸壓縮和解壓縮的朋友可以少走些彎路。下面就來(lái)解釋如何在C#里用http://www.icsharpcode.net下載的SharpZipLib進(jìn)行文件的壓縮和解壓縮。
??? 首先需要在項(xiàng)目里引用SharpZipLib.dll。然后修改其中的關(guān)于壓縮和解壓縮的類(lèi)。實(shí)現(xiàn)源碼如下:
?/// <summary>
?/// 壓縮文件
?/// </summary>
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
namespace Compression
{
?public class ZipClass
?{
?
? public void ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize)
? {
?? //如果文件沒(méi)有找到,則報(bào)錯(cuò)
?? if (! System.IO.File.Exists(FileToZip))
?? {
??? throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
?? }
?
?? System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip,System.IO.FileMode.Open , System.IO.FileAccess.Read);
?? System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
?? ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
?? ZipEntry ZipEntry = new ZipEntry("ZippedFile");
?? ZipStream.PutNextEntry(ZipEntry);
?? ZipStream.SetLevel(CompressionLevel);
?? byte[] buffer = new byte[BlockSize];
?? System.Int32 size =StreamToZip.Read(buffer,0,buffer.Length);
?? ZipStream.Write(buffer,0,size);
?? try
?? {
??? while (size < StreamToZip.Length)
??? {
???? int sizeRead =StreamToZip.Read(buffer,0,buffer.Length);
???? ZipStream.Write(buffer,0,sizeRead);
???? size += sizeRead;
??? }
?? }
?? catch(System.Exception ex)
?? {
??? throw ex;
?? }
?? ZipStream.Finish();
?? ZipStream.Close();
?? StreamToZip.Close();
? }
?
? public void ZipFileMain(string[] args)
? {
?? string[] filenames = Directory.GetFiles(args[0]);
?
?? Crc32 crc = new Crc32();
?? ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));
?
?? s.SetLevel(6); // 0 - store only to 9 - means best compression
?
?? foreach (string file in filenames)
?? {
??? //打開(kāi)壓縮文件
??? FileStream fs = File.OpenRead(file);
??
??? byte[] buffer = new byte[fs.Length];
??? fs.Read(buffer, 0, buffer.Length);
??? ZipEntry entry = new ZipEntry(file);
??
??? 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();
? }
?}
}
現(xiàn)在再來(lái)看看解壓文件類(lèi)的源碼
?/// <summary>
?/// 解壓文件
?/// </summary>
using System;
using System.Text;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Runtime.Serialization.Formatters.Binary;
using System.Data;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;
namespace DeCompression
{
?public class UnZipClass
?{??
? public void UnZip(string[] args)
? {
?? ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));
?
?? ZipEntry theEntry;
?? while ((theEntry = s.GetNextEntry()) != null)
?? {
??
????????? string directoryName = Path.GetDirectoryName(args[1]);
??? string fileName????? = Path.GetFileName(theEntry.Name);
??
??? //生成解壓目錄
??? Directory.CreateDirectory(directoryName);
??
??? if (fileName != String.Empty)
??? {??
???? //解壓文件到指定的目錄
???? FileStream streamWriter = File.Create(args[1]+theEntry.Name);
???
???? int size = 2048;
???? byte[] data = new byte[2048];
???? while (true)
???? {
????? size = s.Read(data, 0, data.Length);
????? if (size > 0)
????? {
?????? streamWriter.Write(data, 0, size);
????? }
????? else
????? {
?????? break;
????? }
???? }
???
???? streamWriter.Close();
??? }
?? }
?? s.Close();
? }
?}
}
??? 有了壓縮和解壓縮的類(lèi)以后,就要在窗體里調(diào)用了。怎么?是新手,不會(huì)調(diào)用?Ok,接著往下看如何在窗體里調(diào)用。
??? 首先在窗體里放置兩個(gè)命令按鈕(不要告訴我你不會(huì)放啊~),然后編寫(xiě)以下源碼
/// <summary>
?/// 調(diào)用源碼
?/// </summary>
????? private void button2_Click_1(object sender, System.EventArgs e)
? {
?? string []FileProperties=new string[2];
?? FileProperties[0]="C:\\unzipped\\";//待壓縮文件目錄
?? FileProperties[1]="C:\\zip\\a.zip";? //壓縮后的目標(biāo)文件
?? ZipClass Zc=new ZipClass();
?? Zc.ZipFileMain(FileProperties);
? }
???? private void button2_Click(object sender, System.EventArgs e)
? {
?? string []FileProperties=new string[2];
?? FileProperties[0]="C:\\zip\\test.zip";//待解壓的文件
?? FileProperties[1]="C:\\unzipped\\";//解壓后放置的目標(biāo)目錄
?? UnZipClass UnZc=new UnZipClass();
?? UnZc.UnZip(FileProperties);
? }
??? 好了,到此為止,如何壓縮和解壓縮的類(lèi)都已經(jīng)完成了,需要的朋友直接拿走調(diào)吧。
轉(zhuǎn)載于:https://www.cnblogs.com/Athrun/archive/2007/07/19/824477.html
總結(jié)
以上是生活随笔為你收集整理的在C#中利用SharpZipLib进行文件的压缩和解压缩的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三层开发中容易犯的错误
- 下一篇: 【玩聚】OneJoo中国的第一个meme