.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 />