天天看點

c# 動态操作 zip\rar 檔案,壓縮解壓元件使用

c# 動态操作 zip\rar 檔案,壓縮解壓元件使用

c# 動态操作一個壓縮檔案,可以動态完成以下操作

1.建立一個 zip

2.向 zip 中附加檔案

3.更新 zip 中指定檔案

4.删除 zip 中指定檔案

5.解壓縮 zip 

6.在zip中提取一個檔案

using System;
using System.IO;
using Ionic.Zip;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Linq;

namespace TestIonicZip
{
    [TestClass]
    public class TestZip
    {
        /// <summary>
        /// 建立一個 zip
        /// </summary>
        [TestMethod]
        public void CreateZip()
        {
            var baseDir = Path.GetFullPath(@"..\..\zips");
            var zipPath = Path.Combine(baseDir,
                string.Format("{0}.zip", DateTime.Now.ToString("yyyyMMddHHmmss")));

            var imgDir = Path.GetFullPath(@"..\..\img");
            var files = Directory.GetFiles(imgDir);

            using (ZipFile zip = new ZipFile())
            {
                String[] filenames = System.IO.Directory.GetFiles(imgDir);

                foreach (String filename in filenames)
                {
                    ZipEntry e = zip.AddFile(filename,"");
                    e.Comment = "Added by Cheeso's CreateZip utility.";
                }

                zip.Comment = String.Format("This zip archive was created by the CreateZip example application on machine '{0}'",
                    System.Net.Dns.GetHostName());

                zip.Save(zipPath);
            }
        }
        /// <summary>
        /// 向 zip 中附加檔案
        /// </summary>
        [TestMethod]
        public void AppendToZip()
        {
            var baseDir = Path.GetFullPath(@"..\..\zips");
            var zipPath = Path.Combine(baseDir,
                string.Format("{0}.zip", DateTime.Now.ToString("yyyyMMddHHmmss")));
            var zipFix = Path.Combine(baseDir,"20151202194926.zip");

            var imgDir = Path.GetFullPath(@"..\..\img");
            var files = Directory.GetFiles(imgDir);

            using (ZipFile zip = new ZipFile(zipFix))
            {
                String[] filenames = System.IO.Directory.GetFiles(imgDir);

                foreach (String filename in filenames)
                {
                    ZipEntry e = zip.AddFile(filename, "aa");
                    e.Comment = "Added by Cheeso's CreateZip utility.";
                }

                zip.Comment = String.Format("This zip archive was created by the CreateZip example application on machine '{0}'",
                    System.Net.Dns.GetHostName());

                zip.Save();
            }
        }
        /// <summary>
        /// 更新 zip 中指定檔案
        /// </summary>
        [TestMethod]
        public void UpdateZip()
        {
            var baseDir = Path.GetFullPath(@"..\..\zips");
            var zipPath = Path.Combine(baseDir,
                string.Format("{0}.zip", DateTime.Now.ToString("yyyyMMddHHmmss")));
            var zipFix = Path.Combine(baseDir, "20151202194926.zip");

            var imgDir = Path.GetFullPath(@"..\..\img");
            var files = Directory.GetFiles(imgDir);

            var bCount = 0;
            var aCount = 0;
            using (ZipFile zip = new ZipFile(zipFix))
            {
                // note: this does not recurse directories! 
                String[] filenames = System.IO.Directory.GetFiles(imgDir);

                bCount = zip.Count;
                //删除一個檔案
                var fileName = "003.jpg";
                var sourceFile = Path.Combine(imgDir, "004.jpg");
                if (zip.ContainsEntry(fileName))
                {
                    var stream = File.OpenRead(sourceFile);
                    var z = zip.UpdateEntry(fileName, stream);
                    z.Comment = DateTime.Now.ToString();
                }
                zip.Comment = String.Format("This zip archive was created by the CreateZip example application on machine '{0}'",
                    System.Net.Dns.GetHostName());

                zip.Save();

                aCount = zip.Count;
            }
        }
        /// <summary>
        /// 删除 zip 中指定檔案
        /// </summary>
        [TestMethod]
        public void DeleteFromZip()
        {
            var baseDir = Path.GetFullPath(@"..\..\zips");
            var zipPath = Path.Combine(baseDir,
                string.Format("{0}.zip", DateTime.Now.ToString("yyyyMMddHHmmss")));
            var zipFix = Path.Combine(baseDir, "20151202194926.zip");

            var imgDir = Path.GetFullPath(@"..\..\img");
            var files = Directory.GetFiles(imgDir);

            var bCount = 0;
            var aCount = 0;
            using (ZipFile zip = new ZipFile(zipFix))
            {
                // note: this does not recurse directories! 
                String[] filenames = System.IO.Directory.GetFiles(imgDir);

                bCount = zip.Count;
                //删除一個檔案
                if(zip.ContainsEntry("002.jpg"))
                    zip.RemoveEntry("002.jpg");
                //删除一個檔案,目錄
                var removeFile = "/aa/002.jpg";
                if (zip.ContainsEntry(removeFile))
                    zip.RemoveEntry(removeFile);

                zip.Comment = String.Format("This zip archive was created by the CreateZip example application on machine '{0}'",
                    System.Net.Dns.GetHostName());

                zip.Save();

                aCount = zip.Count;
            }
            Assert.IsTrue(bCount-1==aCount);
        }

        /// <summary>
        /// 解壓縮 zip 
        /// </summary>
        [TestMethod]
        public void ExtractZip()
        {
            var baseDir = Path.GetFullPath(@"..\..\zips");
            var zipPath = Path.Combine(baseDir,
                string.Format("{0}.zip", DateTime.Now.ToString("yyyyMMddHHmmss")));
            var zipFix = Path.Combine(baseDir, "20151202194926.zip");

            var imgDir = Path.GetFullPath(@"..\..\img");
            var files = Directory.GetFiles(imgDir);

            var bCount = 0;
            var aCount = 0;
            
            using (ZipFile zip = new ZipFile(zipFix))
            {
                var dir = Path.Combine(baseDir, "Extract");
                zip.ExtractAll(dir);
            }
        }

        /// <summary>
        /// 提取一個 檔案
        /// </summary>
        [TestMethod]
        public void ExtractZipByName()
        {
            var baseDir = Path.GetFullPath(@"..\..\zips");
            var zipPath = Path.Combine(baseDir,
                string.Format("{0}.zip", DateTime.Now.ToString("yyyyMMddHHmmss")));
            var zipFix = Path.Combine(baseDir, "20151202194926.zip");

            var imgDir = Path.GetFullPath(@"..\..\img");
            var files = Directory.GetFiles(imgDir);

            var bCount = 0;
            var aCount = 0;
            byte[] content = null;
            //轉換stream為byte[]
            Func<Stream, byte[]> toByteArray = (stream) =>
            {
                byte[] bytes = new byte[stream.Length];
                stream.Read(bytes, 0, bytes.Length);
                // 設定目前流的位置為流的開始 
                stream.Seek(0, SeekOrigin.Begin);
                return bytes;
            };
            var fileName = "004.jpg";
            using (ZipFile zip = new ZipFile(zipFix))
            {
                if (zip.ContainsEntry(fileName))
                {
                    //在跟目錄找
                    var entrys = zip.SelectEntries(fileName,"");
                    var entry = entrys.FirstOrDefault();
                    //将檔案解壓到記憶體流
                    using (var stream = new MemoryStream())
                    {
                        entry.Extract(stream);
                        stream.Seek(0, SeekOrigin.Begin);
                        content = toByteArray(stream);
                    }
                    
                    //在aa目錄找
                    var entrys1 = zip.SelectEntries(fileName, "aa");
                    var entry1 = entrys.FirstOrDefault();
                }
            }
            //建立檔案
            var extractImg = Path.Combine(baseDir, fileName);
            File.WriteAllBytes(extractImg, content);
            Assert.IsTrue(File.Exists(extractImg));
        }
    }
}