原文鏈接:https://www.cnblogs.com/sunyaling/archive/2009/04/13/1434602.html
在C#中實現文件的壓縮和解壓縮,需要使用第三方的組建完成。常用的是:SharpZipLib組件。
1、壓縮和解壓縮有兩種典型的算法,一種是BZIP2算法,另一種是GZIP算法。BZIP2能夠獲得較高的壓縮比,但是壓縮和解壓縮比較耗時,GZIP效率比較高,但是壓縮比較低。
2、BZIP2壓縮算法的相關類,位於命名空間:ICSharpCode.SharpZipLib.BZip2中,算法要求指定輸入流和輸出流,並指定壓縮方法使用的塊大小,一般為2048.
3、GZIP壓縮算法的相關類,位於命名空間:ICSharpCode.SharpZipLib.GZip中,首先創建GZipOutputStream類實例,作為壓縮文件的輸出流,使用GZipOutputStream類實例的Write方法,將從源文件讀取的數據寫入輸入流。同時完成壓縮運算。
4、使用實例:

class ZipAndUnzipFile { public static void GetZipAndUnzipFile(){ string srcFile = @"..\..\testzip.txt";//准備壓縮的文件路徑 string zipFile = @"..\..\testzip";//壓縮后的文件路徑 string unzipFile = @"..\..\testzip_unzip.txt";//解壓后的文件路徑 Console.WriteLine("使用BZIP開始壓縮文件……"); if (BZipFile(srcFile, zipFile + ".bz"))//使用BZIP壓縮文件 { Console.WriteLine("文件壓縮完成"); } else { Console.WriteLine("文件壓縮失敗"); } Console.WriteLine("使用BZIP開始解壓文件……"); if (UnBzipFile(zipFile + ".bz", unzipFile))//使用BZIP解壓文件 { Console.WriteLine("文件解壓完成"); } else { Console.WriteLine("文件解壓失敗"); } Console.WriteLine("使用GZIP開始壓縮文件……"); if (GZipFile(srcFile, zipFile + ".gz"))//使用GZIP壓縮文件 { Console.WriteLine("文件壓縮完成"); } else { Console.WriteLine("文件壓縮失敗"); } Console.WriteLine("使用GZIP開始解壓文件……"); if (UnGzipFile(zipFile + ".gz", unzipFile))//使用GZIP解壓文件 { Console.WriteLine("文件解壓完成"); } else { Console.WriteLine("文件解壓失敗"); } Console.ReadLine(); } //使用BZIP壓縮文件的方法 static bool BZipFile(string sourcefilename, string zipfilename) { bool blResult;//表示壓縮是否成功的返回結果 //為源文件創建文件流實例,作為壓縮方法的輸入流參數 FileStream srcFile = File.OpenRead(sourcefilename); //為壓縮文件創建文件流實例,作為壓縮方法的輸出流參數 FileStream zipFile = File.Open(zipfilename, FileMode.Create); try { //以4096字節作為一個塊的方式壓縮文件 BZip2.Compress(srcFile, zipFile, 4096); blResult=true; } catch (Exception ee) { Console.WriteLine(ee.Message); blResult=false; } srcFile.Close();//關閉源文件流 zipFile.Close();//關閉壓縮文件流 return blResult; } //使用BZIP解壓文件的方法 static bool UnBzipFile(string zipfilename,string unzipfilename) { bool blResult;//表示解壓是否成功的返回結果 //為壓縮文件創建文件流實例,作為解壓方法的輸入流參數 FileStream zipFile = File.OpenRead(zipfilename); //為目標文件創建文件流實例,作為解壓方法的輸出流參數 FileStream destFile = File.Open(unzipfilename, FileMode.Create); try { BZip2.Decompress(zipFile, destFile);//解壓文件 blResult=true; } catch (Exception ee) { Console.WriteLine(ee.Message); blResult=false; } destFile.Close();//關閉目標文件流 zipFile.Close();//關閉壓縮文件流 return blResult; } //使用GZIP壓縮文件的方法 static bool GZipFile(string sourcefilename, string zipfilename) { bool blResult;//表示壓縮是否成功的返回結果 //為源文件創建讀取文件的流實例 FileStream srcFile = File.OpenRead(sourcefilename); //為壓縮文件創建寫入文件的流實例, GZipOutputStream zipFile = new GZipOutputStream(File.Open(zipfilename,FileMode.Create)); try { byte[] FileData = new byte[srcFile.Length];//創建緩沖數據 srcFile.Read(FileData, 0, (int)srcFile.Length);//讀取源文件 zipFile.Write(FileData, 0, FileData.Length);//寫入壓縮文件 blResult = true; } catch (Exception ee) { Console.WriteLine(ee.Message); blResult = false; } srcFile.Close();//關閉源文件 zipFile.Close();//關閉壓縮文件 return blResult; } //使用GZIP解壓文件的方法 static bool UnGzipFile(string zipfilename, string unzipfilename) { bool blResult;//表示解壓是否成功的返回結果 //創建壓縮文件的輸入流實例 GZipInputStream zipFile = new GZipInputStream(File.OpenRead(zipfilename)); //創建目標文件的流 FileStream destFile = File.Open(unzipfilename, FileMode.Create); try { int buffersize = 2048;//緩沖區的尺寸,一般是2048的倍數 byte[] FileData = new byte[buffersize];//創建緩沖數據 while(buffersize>0)//一直讀取到文件末尾 { buffersize = zipFile.Read(FileData,0,buffersize);//讀取壓縮文件數據 destFile.Write(FileData,0,buffersize);//寫入目標文件 } blResult = true; } catch(Exception ee) { Console.WriteLine(ee.Message); blResult = false; } destFile.Close();//關閉目標文件 zipFile.Close();//關閉壓縮文件 return blResult; } }
使用GZIP的壓縮,代碼如下:

private void btnZipUpLoad_Click(object sender, System.EventArgs e) { string fileName = fileUp3.PostedFile.FileName.ToLower(); if(fileName.Length < 5) { btnExport3.Enabled = false; Utils.MessageBox("請選擇txt文件"); return; } if(!fileName.EndsWith(".txt")) { Utils.MessageBox("請選擇txt類型文件"); return; } string dir = Server.MapPath("~/IVR/"); if(!Directory.Exists(dir)) { Directory.CreateDirectory(dir); } fileName = dir+"//ggld.txt"; //這里要先上傳再壓縮,否則會找不到路徑,服務器端不能讀取客戶端的文件並壓縮,不然服務器端不是可以操縱客戶端任何的文件,包括格盤子 fileUp3.PostedFile.SaveAs(fileName); bool flag = false; FileStream srcFile = File.OpenRead(fileName);//要壓縮的文件放在此,服務器上了。為源文件創建讀取文件的流實例 //為壓縮文件創建寫入文件的流實例 GZipOutputStream zipFile = new GZipOutputStream(File.Open(dir+"ggld.zip",FileMode.Create)); try { byte[] FileDate = new byte[srcFile.Length];//創建緩沖數據 srcFile.Read(FileDate,0,(int)srcFile.Length);//讀取源文件 zipFile.Write(FileDate,0,FileDate.Length);//寫入壓縮文件 flag = true; } catch(Exception ee) { string s = ee.Message; flag = false; } srcFile.Close(); zipFile.Close(); if(flag == true) { Response.Redirect("http://219.137.192.203:8080/ivr_stock/ivr_stock.php?SOURCE=ivr_stock&DEST=ld&CONTENT=aHR0cDovL2NoYXQuY25xc3EuY29tL2JjaGF0YXNweC9JVlIvZ2dsZC56aXA="); } }
GZIP最終壓縮為gz格式的壓縮文件,而不是zip格式的壓縮文件,一開始不明白亂用一氣,但方法是對的。
下面介紹如假包換的zip壓縮文件的方法,其實都大同小異:

ZipOutputStream zipFile= new ZipOutputStream(File.Open(dir+"ggld.zip",FileMode.Create)); //GZipOutputStream zipFile = new GZipOutputStream(File.Open(dir+"ggld.zip",FileMode.Create)); try { byte[] FileDate = new byte[srcFile.Length];//創建緩沖數據 srcFile.Read(FileDate,0,(int)srcFile.Length);//讀取源文件 ZipEntry entry = new ZipEntry(fileName);//新建實例 entry.DateTime = DateTime.Now; entry.Size = srcFile.Length; srcFile.Close(); zipFile.PutNextEntry(entry); zipFile.Write(FileDate,0,FileDate.Length);//寫入壓縮文件 flag = true; } catch(Exception ee) { string s = ee.Message; flag = false; } zipFile.Finish(); zipFile.Close(); if(flag == true) { Response.Redirect("http://219.137.192.203:8080/ivr_stock/ivr_stock.php?SOURCE=ivr_stock&DEST=ld&CONTENT=aHR0cDovL2NoYXQuY25xc3EuY29tL2JjaGF0YXNweC9JVlIvZ2dsZC56aXA="); }