天天看點

分卷壓縮 C#代碼實作

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Ionic.Zip;

using System.IO;

namespace IFCA.BL.CM

{

    /// <summary> 

    /// Zip壓縮檔案輔助類(封裝Ionic.Zip) 

    /// </summary> 

    public static class FileCompressZipHelper

    {     

        /// <summary> 

        /// 壓縮指定檔案或目錄 

        /// </summary> 

        /// <param name="fileOrDirectoryName">要進行壓縮的檔案或目錄名稱</param> 

        /// <returns>生成的壓縮檔案名</returns> 

        public static string Compress(string fileOrDirectoryName)

        {

            string zipPath = _GetZipPath(fileOrDirectoryName);

            Compress(fileOrDirectoryName, zipPath);

            return zipPath;

        }

        /// <summary> 

        /// 壓縮指定檔案或目錄 

        /// </summary> 

        /// <param name="fileOrDirectoryName">要進行壓縮的檔案或目錄名稱</param> 

        /// <param name="zipPath">生成的壓縮檔案路徑</param> 

        public static void Compress(string fileOrDirectoryName, string zipPath)

        {

            using (ZipFile zip = new ZipFile(Encoding.GetEncoding("utf-8")))

            {

                zip.AddItem(fileOrDirectoryName, "");

                zip.Save(zipPath);

            }

        }

        /// <summary> 

        /// 分卷壓縮指定檔案或目錄 

        /// </summary> 

        /// <param name="fileOrDirectoryName">要進行壓縮的檔案或目錄名稱</param> 

        /// <param name="segmentSize">分卷大小(MB)</param> 

        public static void Compress(string fileOrDirectoryName, int segmentSize)

        {

            string zipPath = _GetZipPath(fileOrDirectoryName);

            Compress(fileOrDirectoryName, zipPath, ZipDataUnit.MB, segmentSize);

        }

        /// <summary> 

        /// 分卷壓縮指定檔案或目錄 

        /// </summary> 

        /// <param name="fileOrDirectoryName">要進行壓縮的檔案或目錄名稱</param> 

        /// <param name="zipPath">生成的壓縮檔案路徑</param> 

        /// <param name="dataUnit">分卷資料機關</param> 

        /// <param name="segmentSize">分卷大小</param> 

        public static void Compress(string fileOrDirectoryName, string zipPath, ZipDataUnit dataUnit, int segmentSize)

        {

            using (ZipFile zip = new ZipFile(Encoding.GetEncoding("utf-8")))

            {

                zip.MaxOutputSegmentSize = (int)dataUnit * segmentSize;

                zip.AddItem(fileOrDirectoryName, "");

                zip.Save(zipPath);

            }

        }

        /// <summary>

        /// 擷取對應的檔案

        /// </summary>

        /// <param name="path">路徑</param>

        /// <returns></returns>

        private static string _GetZipPath(string path)

        {

            string directory = Path.GetDirectoryName(path);

            if (string.IsNullOrWhiteSpace(directory)) directory = Path.GetPathRoot(path);

            string fileName = Path.GetFileName(path);

            string zipFileName = null;

            //檔案路徑 

            if (!string.IsNullOrWhiteSpace(fileName))

            {

                zipFileName = Path.ChangeExtension(fileName, ".zip");

            }

            else

            {

                zipFileName = directory.Split('\\').Last();

                if (string.IsNullOrEmpty(zipFileName))

                {

                    zipFileName = "未命名";

                }

                else

                {

                    directory = directory.Replace(zipFileName, "");

                }

                zipFileName = ".zip";

            }

            return Path.Combine(directory, zipFileName);

        }

    }

    /// <summary> 

    /// 分卷資料機關 

    /// </summary> 

    public enum ZipDataUnit

    {

        /// <summary> 

        /// 1024位元組 

        /// </summary> 

        KB = 1024,

        /// <summary> 

        /// 1024 * 1024位元組 

        /// </summary> 

        MB = 1024 * 1024,

        /// <summary> 

        /// 1024 * 1024 * 1024位元組 

        /// </summary> 

        GB = 1024 * 1024 * 1024

    }

}

------》調用示例

  #region 示例

        using (DataAccessAdapter adpter = new DataAccessAdapter())

        {

            LinqMetaData linq = new LinqMetaData(adp);

            var Documentpath = linq.CfDocument.Where(c => c.Documentid == 3087).Select(c => c.Documentpath).FirstOrDefault().ToStr();//示例 擷取對應的檔案

            var UNC_PATH = System.Configuration.ConfigurationManager.AppSettings["UNC_Path"];

            var fileOrDirectoryName = System.IO.Path.Combine(UNC_PATH, Documentpath);

            IFCA.BL.CM.FileCompressZipHelper.Compress(fileOrDirectoryName, 2);//分卷壓縮     【預設壓縮到 被壓縮的目錄】

            //var zipPath= System.IO.Path.Combine("C:\\temp\\", "分卷壓縮"+ ".zip");

            //IFCA.BL.CM.FileCompressZipHelper.Compress(fileOrDirectoryName,zipPath, IFCA.BL.CM.ZipDataUnit.MB,5);//分卷壓縮 【可以指定壓縮目錄、名稱】

        }

        #endregion

繼續閱讀