C#實現文件的壓縮和解壓縮


原文鏈接: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;
        }
    }
View Code

使用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=");
            }
        }
View Code

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=");
                
            }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM