C#使用SharpZipLib分析
學(xué)習(xí)C#語(yǔ)言時(shí),經(jīng)常會(huì)遇到文件的壓縮和解壓縮問(wèn)題,這里將介紹C#使用SharpZipLib進(jìn)行文件的壓縮和解壓縮。
C#使用SharpZipLib進(jìn)行文件的壓縮和解壓縮
我在做項(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#使用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)
- {
- ssize = s.Read(data, 0, data.Length);
- if (size > 0)
- {
- streamWriter.Write(data, 0, size);
- }
- else
- {
- break;
- }
- }
- streamwriter.close();
- }
- }
- s.Close();
- }
- }
- }
【編輯推薦】