.net中壓縮和解壓縮的處理
1.利用.net自帶的壓縮和解壓縮方法GZip
參考代碼如下:
//======================================================================== // 類名: CommonCompress /// <summary> /// 用于對文件和字符串進行壓縮 /// </summary> /// <remarks> /// 用于對文件和字符串進行壓縮 /// </remarks> /======================================================================= 變更記錄 序號 更新日期 開發者 變更內容 0001 2008/07/22 張 新建 =======================================================================/ public class CommonCompress { /// <summary> /// 壓縮字符串 /// </summary> /// <param name="strUncompressed">未壓縮的字符串</param> /// <returns>壓縮的字符串</returns> public static string StringCompress(string strUncompressed) { byte[] bytData = System.Text.Encoding.Unicode.GetBytes(strUncompressed); MemoryStream ms = new MemoryStream(); Stream s = new GZipStream(ms, CompressionMode.Compress); s.Write(bytData, 0, bytData.Length); s.Close(); byte[] dataCompressed = (byte[])ms.ToArray(); return System.Convert.ToBase64String(dataCompressed, 0, dataCompressed.Length); }/// <summary> /// 解壓縮字符串 /// </summary> /// <param name="strCompressed">壓縮的字符串</param> /// <returns>未壓縮的字符串</returns> public static string StringDeCompress(string strCompressed) { System.Text.StringBuilder strUncompressed = new System.Text.StringBuilder(); int totalLength = 0; byte[] bInput = System.Convert.FromBase64String(strCompressed); ; byte[] dataWrite = new byte[4096]; Stream s = new GZipStream(new MemoryStream(bInput), CompressionMode.Decompress); while (true) { int size = s.Read(dataWrite, 0, dataWrite.Length); if (size > 0) { totalLength += size; strUncompressed.Append(System.Text.Encoding.Unicode.GetString(dataWrite, 0, size)); } else { break; } } s.Close(); return strUncompressed.ToString(); } /// <summary> /// 壓縮文件 /// </summary> /// <param name="iFile">壓縮前文件路徑</param> /// <param name="oFile">壓縮后文件路徑</param> public static void CompressFile(string iFile, string oFile) { //判斷文件是否存在 if (File.Exists(iFile) == false) { throw new FileNotFoundException("文件未找到!"); } //創建文件流 byte[] buffer = null; FileStream iStream = null; FileStream oStream = null; GZipStream cStream = null; try { //把文件寫進數組 iStream = new FileStream(iFile, FileMode.Open, FileAccess.Read, FileShare.Read); buffer = new byte[iStream.Length]; int num = iStream.Read(buffer, 0, buffer.Length); if (num != buffer.Length) { throw new ApplicationException("壓縮文件異常!"); } //創建文件輸出流并輸出 oStream = new FileStream(oFile, FileMode.OpenOrCreate, FileAccess.Write); cStream = new GZipStream(oStream, CompressionMode.Compress, true); cStream.Write(buffer, 0, buffer.Length); } finally { //關閉流對象 if (iStream != null) iStream.Close(); if (cStream != null) cStream.Close(); if (oStream != null) oStream.Close(); } } /// <summary> /// 解壓縮文件 /// </summary> /// <param name="iFile">壓縮前文件路徑</param> /// <param name="oFile">壓縮后文件路徑</param> public static void DecompressFile(string iFile, string oFile) { //判斷文件是否存在 if (File.Exists(iFile) == false) { throw new FileNotFoundException("文件未找到!"); } //創建文件流 FileStream iStream = null; FileStream oStream = null; GZipStream dStream = null; byte[] qBuffer = new byte[4]; try { //把壓縮文件寫入數組 iStream = new FileStream(iFile, FileMode.Open); dStream = new GZipStream(iStream, CompressionMode.Decompress, true); int position = (int)iStream.Length - 4; iStream.Position = position; iStream.Read(qBuffer, 0, 4); iStream.Position = 0; int num = BitConverter.ToInt32(qBuffer, 0); byte[] buffer = new byte[num + 100]; int offset = 0, total = 0; while (true) { int bytesRead = dStream.Read(buffer, offset, 100); if (bytesRead == 0) break; offset += bytesRead; total += bytesRead; } //創建輸出流并輸出 oStream = new FileStream(oFile, FileMode.Create); oStream.Write(buffer, 0, total); oStream.Flush(); } finally { //關閉流對象 if (iStream != null) iStream.Close(); if (dStream != null) dStream.Close(); if (oStream != null) oStream.Close(); } } }</pre> <h4 style="padding-bottom:0px;line-height:25px;margin:0px;padding-left:0px;padding-right:0px;font-family:verdana,Arial,Helvetica,sans-serif;font-size:14px;padding-top:0px;">2.利用ICSharpCode的壓縮和解壓縮方法,需引用ICSharpCode.SharpZipLib.dll,這個類庫是開源的,源碼地址<a style="border-bottom:#333333 1px dotted;padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;color:#000000;text-decoration:none;padding-top:0px;" href="/misc/goto?guid=4959618254792586146" target="_blank">http://www.icsharpcode.net/OpenSource/SharpZipLib/Download.aspx</a></h4>
參考代碼如下:
using System;using System.Collections.Generic; using System.IO;using ICSharpCode.SharpZipLib.Zip;using ICSharpCode.SharpZipLib.Checksums;namespace ZYBNET.FW.Utility.CommonMethod { //======================================================================== // 類名: ZipHelper /// <summary> /// 用于對文件和字符串進行壓縮 /// </summary> /// <remarks> /// 用于對文件和字符串進行壓縮 /// </remarks> /======================================================================= 變更記錄 序號 更新日期 開發者 變更內容 0001 2008/07/22 張 新建 =======================================================================/ public class ZipHelper {#region 壓縮文件夾,支持遞歸 /// <summary> /// 壓縮文件夾 /// </summary> /// <param name="dir">待壓縮的文件夾</param> /// <param name="targetFileName">壓縮后文件路徑(包括文件名)</param> /// <param name="recursive">是否遞歸壓縮</param> /// <returns></returns> public static bool Compress(string dir, string targetFileName, bool recursive) { //如果已經存在目標文件,詢問用戶是否覆蓋 if (File.Exists(targetFileName)) { throw new Exception("同名文件已經存在!"); } string[] ars = new string[2]; if (recursive == false) { ars[0] = dir; ars[1] = targetFileName; return ZipFileDictory(ars); } FileStream zipFile; ZipOutputStream zipStream; //打開壓縮文件流 zipFile = File.Create(targetFileName); zipStream = new ZipOutputStream(zipFile); if (dir != String.Empty) { CompressFolder(dir, zipStream, dir); } //關閉壓縮文件流 zipStream.Finish(); zipStream.Close(); if (File.Exists(targetFileName)) return true; else return false; } /// <summary> /// 壓縮目錄 /// </summary> /// <param name="args">數組(數組[0]: 要壓縮的目錄; 數組[1]: 壓縮的文件名)</param> public static bool ZipFileDictory(string[] args) { ZipOutputStream zStream = null; try { string[] filenames = Directory.GetFiles(args[0]); Crc32 crc = new Crc32(); zStream = new ZipOutputStream(File.Create(args[1])); zStream.SetLevel(6); //循環壓縮文件夾中的文件 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(file); entry.DateTime = DateTime.Now; entry.Size = fs.Length; fs.Close(); crc.Reset(); crc.Update(buffer); entry.Crc = crc.Value; zStream.PutNextEntry(entry); zStream.Write(buffer, 0, buffer.Length); } } catch { throw; } finally { zStream.Finish(); zStream.Close(); } return true; } /// <summary> /// 壓縮某個子文件夾 /// </summary> /// <param name="basePath">待壓縮路徑</param> /// <param name="zips">壓縮文件流</param> /// <param name="zipfolername">待壓縮根路徑</param> private static void CompressFolder(string basePath, ZipOutputStream zips, string zipfolername) { if (File.Exists(basePath)) { AddFile(basePath, zips, zipfolername); return; } string[] names = Directory.GetFiles(basePath); foreach (string fileName in names) { AddFile(fileName, zips, zipfolername); } names = Directory.GetDirectories(basePath); foreach (string folderName in names) { CompressFolder(folderName, zips, zipfolername); } } /// <summary> /// 壓縮某個子文件 /// </summary> /// <param name="fileName">待壓縮文件</param> /// <param name="zips">壓縮流</param> /// <param name="zipfolername">待壓縮根路徑</param> private static void AddFile(string fileName, ZipOutputStream zips, string zipfolername) { if (File.Exists(fileName)) { CreateZipFile(fileName, zips, zipfolername); } } /// <summary> /// 壓縮單獨文件 /// </summary> /// <param name="FileToZip">待壓縮文件</param> /// <param name="zips">壓縮流</param> /// <param name="zipfolername">待壓縮根路徑</param> private static void CreateZipFile(string FileToZip, ZipOutputStream zips, string zipfolername) { try { FileStream StreamToZip = new FileStream(FileToZip, FileMode.Open, FileAccess.Read); string temp = FileToZip; string temp1 = zipfolername; if (temp1.Length > 0) { temp = temp.Replace(zipfolername + "\\", ""); } ZipEntry ZipEn = new ZipEntry(temp); zips.PutNextEntry(ZipEn); byte[] buffer = new byte[16384]; System.Int32 size = StreamToZip.Read(buffer, 0, buffer.Length); zips.Write(buffer, 0, size); try { while (size < StreamToZip.Length) { int sizeRead = StreamToZip.Read(buffer, 0, buffer.Length); zips.Write(buffer, 0, sizeRead); size += sizeRead; } } catch (System.Exception ex) { throw ex; } StreamToZip.Close(); } catch { throw; } } #endregion #region 解壓縮 /// <summary> /// 功能:解壓zip格式的文件。 /// </summary> /// <param name="zipFilePath">壓縮文件路徑</param> /// <param name="unZipDir">解壓文件存放路徑,為空時默認與壓縮文件同一級目錄下,跟壓縮文件同名的文件夾</param> /// <returns>解壓是否成功</returns> public static void UnZipFile(string zipFilePath, string unZipDir) { if (zipFilePath == string.Empty) { throw new Exception("壓縮文件不能為空!"); } if (!File.Exists(zipFilePath)) { throw new Exception("壓縮文件不存在!"); } //解壓文件夾為空時默認與壓縮文件同一級目錄下,跟壓縮文件同名的文件夾 if (unZipDir == string.Empty) unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath)); if (!unZipDir.EndsWith("http://")) unZipDir += "http://"; if (!Directory.Exists(unZipDir)) Directory.CreateDirectory(unZipDir); try { using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath))) { ZipEntry theEntry; while ((theEntry = s.GetNextEntry()) != null) { string directoryName = Path.GetDirectoryName(theEntry.Name); string fileName = Path.GetFileName(theEntry.Name); if (directoryName.Length > 0) { Directory.CreateDirectory(unZipDir + directoryName); } if (!directoryName.EndsWith("http://")) directoryName += "http://"; if (fileName != String.Empty) { using (FileStream streamWriter = File.Create(unZipDir + 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; } } } } } } } catch { throw; } } #endregion }
}</pre>
3.利用java的壓縮和解壓縮方法,需引用vjslib.dll
至于這種方法的使用,大家可以去查閱msdn,這里就不寫了
4.利用zlibwapi.dll的API進行壓縮
據說壓縮效率比較好,但是在網上沒找到供下載的鏈接,有興趣的朋友可以試試
5.使用System.IO.Packaging壓縮和解壓
System.IO.Packaging在WindowsBase.dll程序集下,使用時需要添加對WindowsBase的引用
/// <summary> /// Add a folder along with its subfolders to a Package /// </summary> /// <param name="folderName">The folder to add</param> /// <param name="compressedFileName">The package to create</param> /// <param name="overrideExisting">Override exsisitng files</param> /// <returns></returns> static bool PackageFolder(string folderName, string compressedFileName, bool overrideExisting) { if (folderName.EndsWith(@"\")) folderName = folderName.Remove(folderName.Length - 1); bool result = false; if (!Directory.Exists(folderName)) { return result; }if (!overrideExisting && File.Exists(compressedFileName)) { return result; } try { using (Package package = Package.Open(compressedFileName, FileMode.Create)) { var fileList = Directory.EnumerateFiles(folderName, "*", SearchOption.AllDirectories); foreach (string fileName in fileList) { //The path in the package is all of the subfolders after folderName string pathInPackage; pathInPackage = Path.GetDirectoryName(fileName).Replace(folderName, string.Empty) + "/" + Path.GetFileName(fileName); Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(pathInPackage, UriKind.Relative)); PackagePart packagePartDocument = package.CreatePart(partUriDocument,"", CompressionOption.Maximum); using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { fileStream.CopyTo(packagePartDocument.GetStream()); } } } result = true; } catch (Exception e) { throw new Exception("Error zipping folder " + folderName, e); } return result; }
/// <summary> /// Compress a file into a ZIP archive as the container store /// </summary> /// <param name="fileName">The file to compress</param> /// <param name="compressedFileName">The archive file</param> /// <param name="overrideExisting">override existing file</param> /// <returns></returns> static bool PackageFile(string fileName, string compressedFileName, bool overrideExisting) { bool result = false;
if (!File.Exists(fileName)) { return result; } if (!overrideExisting && File.Exists(compressedFileName)) { return result; } try { Uri partUriDocument = PackUriHelper.CreatePartUri(new Uri(Path.GetFileName(fileName), UriKind.Relative)); using (Package package = Package.Open(compressedFileName, FileMode.OpenOrCreate)) { if (package.PartExists(partUriDocument)) { package.DeletePart(partUriDocument); } PackagePart packagePartDocument = package.CreatePart(partUriDocument, "", CompressionOption.Maximum); using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { fileStream.CopyTo(packagePartDocument.GetStream()); } } result = true; } catch (Exception e) { throw new Exception("Error zipping file " + fileName, e); } return result; }
} 3、zip文件解壓
Code/// <summary> /// Extract a container Zip. NOTE: container must be created as Open Packaging Conventions (OPC) specification /// </summary> /// <param name="folderName">The folder to extract the package to</param> /// <param name="compressedFileName">The package file</param> /// <param name="overrideExisting">override existing files</param> /// <returns></returns> static bool UncompressFile(string folderName, string compressedFileName, bool overrideExisting) { bool result = false; try { if (!File.Exists(compressedFileName)) { return result; }
DirectoryInfo directoryInfo = new DirectoryInfo(folderName); if (!directoryInfo.Exists) directoryInfo.Create();</pre>來自:http://blog.csdn.net/make1828/article/details/11163457<br />