C#Zip方式壓縮檔和解壓縮檔案代碼

來源:互聯網
上載者:User

壓縮和解壓縮分為:單一檔案壓縮和整個檔案夾壓縮,其中檔案夾壓縮現在還沒實現遞迴檔案夾,現已夠用測試通過,代碼如下:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.IO.Compression;using System.Collections;using System.Runtime.Serialization.Formatters.Binary;using System.Runtime.Serialization;namespace Common{    /// <summary>    /// 壓縮檔    /// </summary>    public class Zip    {        #region 壓縮解壓單一檔案        /// <summary>        /// 壓縮單一檔案        /// </summary>        /// <param name="sourceFile">源檔案路徑</param>        /// <param name="destinationFile">目標檔案路徑</param>        public static void CompressFile(string sourceFile, string destinationFile)        {            if (!File.Exists(sourceFile)) throw new FileNotFoundException();            using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read, FileShare.Read))            {                byte[] buffer = new byte[sourceStream.Length];                int checkCounter = sourceStream.Read(buffer, 0, buffer.Length);                if (checkCounter != buffer.Length) throw new ApplicationException();                using (FileStream destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write))                {                    using (GZipStream compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true))                    {                        compressedStream.Write(buffer, 0, buffer.Length);                    }                }            }        }        public static void CompressFile(byte[] source, string destinationFile)        {            using (FileStream destinationStream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.Write))            {                using (GZipStream compressedStream = new GZipStream(destinationStream, CompressionMode.Compress, true))                {                    compressedStream.Write(source, 0, source.Length);                }            }        }        /// <summary>        /// 解壓縮檔案        /// </summary>        /// <param name="sourceFile">源檔案路徑</param>        /// <param name="destinationFile">目標檔案路徑</param>        public static void DecompressFile(string sourceFile, string destinationFile)        {            if (!File.Exists(sourceFile)) throw new FileNotFoundException();            using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open))            {                byte[] quartetBuffer = new byte[4];                int position = (int)sourceStream.Length - 4;                sourceStream.Position = position;                sourceStream.Read(quartetBuffer, 0, 4);                sourceStream.Position = 0;                int checkLength = BitConverter.ToInt32(quartetBuffer, 0);                byte[] buffer = new byte[checkLength + 100];                using (GZipStream decompressedStream = new GZipStream(sourceStream, CompressionMode.Decompress, true))                {                    int total = 0;                    for (int offset = 0; ; )                    {                        int bytesRead = decompressedStream.Read(buffer, offset, 100);                        if (bytesRead == 0) break;                        offset += bytesRead;                        total += bytesRead;                    }                    using (FileStream destinationStream = new FileStream(destinationFile, FileMode.Create))                    {                        destinationStream.Write(buffer, 0, total);                        destinationStream.Flush();                    }                }            }        }        #endregion        #region 壓縮解壓檔案夾        /**/        /// <summary>        /// 對目標檔案夾進行壓縮,將壓縮結果儲存為指定檔案        /// </summary>        /// <param name="dirPath">目標檔案夾</param>        /// <param name="fileName">壓縮檔</param>        public static void CompressFolder(string dirPath, string fileName)        {            ArrayList list = new ArrayList();            foreach (string f in Directory.GetFiles(dirPath))            {                byte[] destBuffer = File.ReadAllBytes(f);                SerializeFileInfo sfi = new SerializeFileInfo(f, destBuffer);                list.Add(sfi);            }            IFormatter formatter = new BinaryFormatter();            using (Stream s = new MemoryStream())            {                formatter.Serialize(s, list);                s.Position = 0;                CreateCompressFile(s, fileName);            }        }        /**/        /// <summary>        /// 對目標壓縮檔解壓縮,將內容解壓縮到指定檔案夾        /// </summary>        /// <param name="fileName">壓縮檔</param>        /// <param name="dirPath">解壓縮目錄</param>        public static void DeCompressFolder(string fileName, string dirPath)        {            using (Stream source = File.OpenRead(fileName))            {                using (Stream destination = new MemoryStream())                {                    using (GZipStream input = new GZipStream(source, CompressionMode.Decompress, true))                    {                        byte[] bytes = new byte[4096];                        int n;                        while ((n = input.Read(bytes, 0, bytes.Length)) != 0)                        {                            destination.Write(bytes, 0, n);                        }                    }                    destination.Flush();                    destination.Position = 0;                    DeSerializeFiles(destination, dirPath);                }            }        }        private static void DeSerializeFiles(Stream s, string dirPath)        {            BinaryFormatter b = new BinaryFormatter();            ArrayList list = (ArrayList)b.Deserialize(s);            foreach (SerializeFileInfo f in list)            {                string newName = dirPath + Path.GetFileName(f.FileName);                using (FileStream fs = new FileStream(newName, FileMode.Create, FileAccess.Write))                {                    fs.Write(f.FileBuffer, 0, f.FileBuffer.Length);                    fs.Close();                }            }        }        private static void CreateCompressFile(Stream source, string destinationName)        {            using (Stream destination = new FileStream(destinationName, FileMode.Create, FileAccess.Write))            {                using (GZipStream output = new GZipStream(destination, CompressionMode.Compress))                {                    byte[] bytes = new byte[4096];                    int n;                    while ((n = source.Read(bytes, 0, bytes.Length)) != 0)                    {                        output.Write(bytes, 0, n);                    }                }            }        }        #endregion    }    //測試    //private void btnZip_Click(object sender, EventArgs e)    //{    //    Common.Zip.CompressFile("database.mdb", "test.zip");    //    Common.Zip.CompressFolder("sourcefolder", "sourcefolder.zip");    //}    //private void btnUnZip_Click(object sender, EventArgs e)    //{    //    Common.Zip.DecompressFile("test.zip", "database2.mdb");    //    Common.Zip.DeCompressFolder("sourcefolder.zip", "folder/");    //}    [Serializable]    class SerializeFileInfo    {        public SerializeFileInfo(string name, byte[] buffer)        {            fileName = name;            fileBuffer = buffer;        }        string fileName;        public string FileName        {            get            {                return fileName;            }        }        byte[] fileBuffer;        public byte[] FileBuffer        {            get            {                return fileBuffer;            }        }    }}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.