.Net類庫 壓縮文件 與 Ionic.Zip 批量壓縮不同目錄文件與解壓 文件

using System;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
using Ionic.Zip;
using ZipFile = Ionic.Zip.ZipFile;

namespace WebApplication5.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        private string zipFile = $@"e:\壓縮文件全部下載測試_{DateTime.Now.ToString("yyyyMMdd")}.rar";

        private string[] files = new[]
        {
            "F:/BQ/xx/-2ed47457e8d3d0a0.jpg",
            "F:/BQ/戰無不勝表情包/............. - 副本.bmp",
            "E:/------/1.柱狀圖的用法/HighCharts柱狀圖的使用.png",
        };

        #region 第一種

        /// <summary>
        /// 第三方 Ionic.Zip(NuGet 搜索安裝)
        /// </summary>
        /// <returns></returns>
        public string DownZip1()
        {
            string res = string.Empty;

            //判斷是否存在
            if (IsExist(zipFile))
            {
                //增量壓縮
                using (ZipFile zip = new ZipFile(zipFile, Encoding.Default))
                {
                    foreach (var item in zip.Entries)
                    {
                        res += item.FileName+',';
                    }

                    zip.UpdateFiles(files, "");
                    zip.Save();
                }

                //刪除文件
                // DeleteFile(zipFile);

                //下載文件
                // Download1(zipFile.Replace(@"e:\", ""), zipFile);
                // Download2(zipFile.Replace(@"e:\", ""), zipFile);
            }
            else
            {
                //設置路徑和編碼.設置編碼爲了防止 中文文件名亂碼
                using (ZipFile zip = new ZipFile(zipFile, Encoding.Default))
                {
                    //zip.Password = "123456"; //加密
                    zip.AddFiles(files, "");//添加文件
                    zip.Save();
                }

                res += $"共壓縮{files.Count()}個文件\n";
                res += string.Join(Environment.NewLine, files.ToArray());
                res += Environment.NewLine;

                //刪除壓縮包中的某個文件
                //DeleteFileInZip(zipFile, "-2ed47457e8d3d0a0.jpg");
            }
            return res;
        }

        #endregion 第一種

        #region 第二種

        /// <summary>
        /// 微軟的(在添加引用中搜索)
        /// 1.system.IO.Compression 
        /// 2.system.IO.Compression.FileSystem
        /// </summary>
        /// <returns></returns>
        public string DownZip2()
        {
            string res = string.Empty;
            try
            {
                //壓縮
                using (ZipArchive archive = new ZipArchive(new FileStream(zipFile, FileMode.OpenOrCreate), ZipArchiveMode.Create))//Create,Read,Update
                {
                    string path = string.Empty;
                    string filename = string.Empty;

                    for (int i = 0; i < files.Length; i++)
                    {
                        path = files[i];
                        ZipArchiveEntry readMeEntry = archive.CreateEntry(Path.GetFileName(path));
                        using (System.IO.Stream stream = readMeEntry.Open())
                        {
                            byte[] bytes = System.IO.File.ReadAllBytes(path);
                            stream.Write(bytes, 0, bytes.Length);
                        }
                    }
                }

                //讀取文件
                using (ZipArchive archive = new ZipArchive(new FileStream(zipFile, FileMode.OpenOrCreate), ZipArchiveMode.Read))
                {
                    int i = 1;
                    foreach (var zipArchiveEntry in archive.Entries)
                    {
                        res += i + ":" + zipArchiveEntry.FullName + ",  ";
                        i++;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            return res;
        }

        #endregion 第二種

        #region DownHelper

        /// <summary>
        /// 刪除一個文件
        /// </summary>
        /// <param name="filePath"></param>
        public void DeleteFile(string filePath)
        {
            System.IO.File.Delete(filePath);
        }

        /// <summary>
        /// 從zip文件中刪除一個文件,注意無法直接刪除一個文件夾
        /// </summary>
        /// <param name="zipFilePath">zip路徑 eg:E:\\yangfeizai\\test.zip</param>
        /// <param name="deleteFileName">要刪除文件的名稱(無法直接刪除文件夾) eg:Jayzai.xml</param>
        public void DeleteFileInZip(string zipFilePath, string deleteFileName)
        {
            using (ZipFile zip = ZipFile.Read(zipFilePath))
            {
                //zip["Jayzai.xml"] = null;

                zip.RemoveEntry(deleteFileName);
                zip.Save();
            }
        }

        /// <summary>
        /// 檢查文件是否存在
        /// </summary>
        /// <returns></returns>
        public bool IsExist(string filePath)
        {
            if (System.IO.File.Exists(filePath))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        /// <summary>
        /// 下載文件1
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="filePath"></param>
        public void Download1(string fileName, string filePath)
        {
            //string fileName = "aaa.txt";//客戶端保存的文件名
            //string filePath = Server.MapPath("~/Document/123.txt");//路徑
            FileInfo fileinfo = new FileInfo(filePath);
            Response.Clear();         //清除緩衝區流中的所有內容輸出
            Response.ClearContent();  //清除緩衝區流中的所有內容輸出
            Response.ClearHeaders();  //清除緩衝區流中的所有頭
            Response.Buffer = true;   //該值指示是否緩衝輸出,並在完成處理整個響應之後將其發送
            Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
            Response.AddHeader("Content-Length", fileinfo.Length.ToString());
            Response.AddHeader("Content-Transfer-Encoding", "binary");
            Response.ContentType = "application/unknow";  //獲取或設置輸出流的 HTTP MIME 類型
            Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312"); //獲取或設置輸出流的 HTTP 字符集
            Response.TransmitFile(filePath);
            Response.End();
        }

        /// <summary>
        /// 下載文件2
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="filePath"></param>
        public void Download2(string fileName, string filePath)
        {
            //string fileName = "aaa.txt";//客戶端保存的文件名
            //string filePath = Server.MapPath("~/Document/123.txt");//路徑

            System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);
            if (fileInfo.Exists == true)
            {
                const long ChunkSize = 102400;//100K 每次讀取文件,只讀取100K,這樣可以緩解服務器的壓力
                byte[] buffer = new byte[ChunkSize];

                Response.Clear();
                System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
                long dataLengthToRead = iStream.Length;//獲取下載的文件總大小
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
                while (dataLengthToRead > 0 && Response.IsClientConnected)
                {
                    int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//讀取的大小
                    Response.OutputStream.Write(buffer, 0, lengthRead);
                    Response.Flush();
                    dataLengthToRead = dataLengthToRead - lengthRead;
                }
                Response.Close();
            }
        }

        #endregion DownHelper

        #region 解壓

        //// 從 zip 文件中解壓出一個文件  
        //public void ExeSingleDeComp(string fileName)
        //{
        //    using (ZipFile zip = ZipFile.Read(fileName))
        //    {
        //       // zip.Password = "123456";// 密碼解壓  
        //        //Extract 解壓 zip 文件包的方法,參數是保存解壓後文件的路基  
        //        zip["Jayzai.xml"].Extract(@"c:\\");
        //    }
        //

        //// 從 zip 文件中解壓全部文件  
        //public void ExeAllDeComp(string fileName)
        //{
        //    using (ZipFile zip = ZipFile.Read(fileName))
        //    {
        //        //zip.Password = "123456";// 密碼解壓  
        //        foreach (ZipEntry entry in zip)
        //        {
        //            //Extract 解壓 zip 文件包的方法,參數是保存解壓後文件的路基  
        //            entry.Extract(@"c:\\");
        //        }
        //    }
        //}


        #endregion
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章