zoukankan      html  css  js  c++  java
  • C#压缩文件

    一、引入ICSharpCode.SharpZipLib

    新建个帮助类 ZipHelper.cs  然后 添加 dll 引用

    二、添加完dll引用之后 我们 需要添加 这几个Using引用

    using ICSharpCode.SharpZipLib.Checksums; 
    using ICSharpCode.SharpZipLib.Zip;
    using System;
    using System.IO;

    三、压缩单个文件

         /// <summary>
            /// ZIP:压缩单个文件
            /// add yuangang by 2016-06-13
            /// </summary>
            /// <param name="FileToZip">需要压缩的文件(绝对路径)</param>
            /// <param name="ZipedPath">压缩后的文件路径(绝对路径)</param>
            /// <param name="ZipedFileName">压缩后的文件名称(文件名,默认 同源文件同名)</param>
            /// <param name="CompressionLevel">压缩等级(0 无 - 9 最高,默认 5)</param>
            /// <param name="BlockSize">缓存大小(每次写入文件大小,默认 2048)</param>
            /// <param name="IsEncrypt">是否加密(默认 加密)</param>
            public static void ZipFile(string FileToZip, string ZipedPath, string ZipedFileName = "", int CompressionLevel = 5, int BlockSize = 2048, bool IsEncrypt = true)
            {
                //如果文件没有找到,则报错
                if (!System.IO.File.Exists(FileToZip))
                {
                    throw new System.IO.FileNotFoundException("指定要压缩的文件: " + FileToZip + " 不存在!");
                }
    
                //文件名称(默认同源文件名称相同)
                string ZipFileName = string.IsNullOrEmpty(ZipedFileName) ? ZipedPath + "\" + new FileInfo(FileToZip).Name.Substring(0, new FileInfo(FileToZip).Name.LastIndexOf('.')) + ".zip" : ZipedPath + "\" + ZipedFileName + ".zip";
    
                using (System.IO.FileStream ZipFile = System.IO.File.Create(ZipFileName))
                {
                    using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))
                    {
                        using (System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip, System.IO.FileMode.Open, System.IO.FileAccess.Read))
                        {
                            string fileName = FileToZip.Substring(FileToZip.LastIndexOf("\") + 1);
    
                            ZipEntry ZipEntry = new ZipEntry(fileName);
    
                            if (IsEncrypt)
                            {
                                //压缩文件加密
                                ZipStream.Password = “123”;
                            }
    
                            ZipStream.PutNextEntry(ZipEntry);
    
                            //设置压缩级别
                            ZipStream.SetLevel(CompressionLevel);
    
                            //缓存大小
                            byte[] buffer = new byte[BlockSize];
    
                            int sizeRead = 0;
    
                            try
                            {
                                do
                                {
                                    sizeRead = StreamToZip.Read(buffer, 0, buffer.Length);
                                    ZipStream.Write(buffer, 0, sizeRead);
                                }
                                while (sizeRead > 0);
                            }
                            catch (System.Exception ex)
                            {
                                throw ex;
                            }
    
                            StreamToZip.Close();
                        }
    
                        ZipStream.Finish();
                        ZipStream.Close();
                    }
    
                    ZipFile.Close();
                }
            }

    四、压缩文件夹

         /// <summary>
            /// ZIP压缩文件夹
            /// </summary>
            /// <param name="DirectoryToZip">需要压缩的文件夹(绝对路径)</param>
            /// <param name="ZipedPath">压缩后的文件路径(绝对路径)</param>
            /// <param name="ZipedFileName">压缩后的文件名称(文件名,默认 同源文件夹同名)</param>
            /// <param name="Encrypt">是否加密(默认 不加密)</param>
            public static void ZipDirectory(string DirectoryToZip, string ZipedPath, string ZipedFileName = "", string Encrypt = "")
            {
                //如果目录不存在,则报错
                if (!Directory.Exists(DirectoryToZip))
                {
                    throw new FileNotFoundException("指定的目录: " + DirectoryToZip + " 不存在!");
                }
    
                //文件名称(默认同源文件名称相同)
                string ZipFileName = string.IsNullOrEmpty(ZipedFileName) ? ZipedPath + "\" + new DirectoryInfo(DirectoryToZip).Name + ".zip" : ZipedPath + "\" + ZipedFileName + ".zip";
    
                using (System.IO.FileStream ZipFile = System.IO.File.Create(ZipFileName))
                {
                    using (ZipOutputStream s = new ZipOutputStream(ZipFile))
                    {
                        if (!string.IsNullOrEmpty(Encrypt)) s.Password = Encrypt;
                        ZipSetp(DirectoryToZip, s, "");
                    }
                }
            }
            /// <summary>
            /// 递归遍历目录
            /// </summary>
            private static void ZipSetp(string strDirectory, ZipOutputStream s, string parentPath)
            {
                if (strDirectory[strDirectory.Length - 1] != Path.DirectorySeparatorChar)
                {
                    strDirectory += Path.DirectorySeparatorChar;
                }
                Crc32 crc = new Crc32();
    
                string[] filenames = Directory.GetFileSystemEntries(strDirectory);
    
                foreach (string file in filenames)// 遍历所有的文件和目录
                {
    
                    if (Directory.Exists(file))// 先当作目录处理,如果存在这个目录就递归Copy该目录下面的文件
                    {
                        string pPath = parentPath;
                        pPath += file.Substring(file.LastIndexOf("\") + 1);
                        pPath += "\";
                        ZipSetp(file, s, pPath);
                    }
    
                    else // 否则直接压缩文件
                    {
                        //打开压缩文件
                        using (FileStream fs = File.OpenRead(file))
                        {
    
                            byte[] buffer = new byte[fs.Length];
                            fs.Read(buffer, 0, buffer.Length);
    
                            string fileName = parentPath + file.Substring(file.LastIndexOf("\") + 1);
                            ZipEntry entry = new ZipEntry(fileName);
    
                            entry.DateTime = DateTime.Now;
                            entry.Size = fs.Length;
    
                            fs.Close();
    
                            crc.Reset();
                            crc.Update(buffer);
    
                            entry.Crc = crc.Value;
                            s.PutNextEntry(entry);
    
                            s.Write(buffer, 0, buffer.Length);
                        }
                    }
                }
            }

    五、解压一个ZIP文件

         /// <summary>
            /// ZIP:解压一个zip文件
            /// add yuangang by 2016-06-13
            /// </summary>
            /// <param name="ZipFile">需要解压的Zip文件(绝对路径)</param>
            /// <param name="TargetDirectory">解压到的目录</param>
            /// <param name="Password">解压密码</param>
            /// <param name="OverWrite">是否覆盖已存在的文件</param>
            public static void UnZip(string ZipFile, string TargetDirectory, string Password, bool OverWrite = true)
            {
                //如果解压到的目录不存在,则报错
                if (!System.IO.Directory.Exists(TargetDirectory))
                {
                    throw new System.IO.FileNotFoundException("指定的目录: " + TargetDirectory + " 不存在!");
                }
                //目录结尾
                if (!TargetDirectory.EndsWith("\")) { TargetDirectory = TargetDirectory + "\"; }
    
                using (ZipInputStream zipfiles = new ZipInputStream(File.OpenRead(ZipFile)))
                {
                    zipfiles.Password = Password;
                    ZipEntry theEntry;
    
                    while ((theEntry = zipfiles.GetNextEntry()) != null)
                    {
                        string directoryName = "";
                        string pathToZip = "";
                        pathToZip = theEntry.Name;
    
                        if (pathToZip != "")
                            directoryName = Path.GetDirectoryName(pathToZip) + "\";
    
                        string fileName = Path.GetFileName(pathToZip);
    
                        Directory.CreateDirectory(TargetDirectory + directoryName);
    
                        if (fileName != "")
                        {
                            if ((File.Exists(TargetDirectory + directoryName + fileName) && OverWrite) || (!File.Exists(TargetDirectory + directoryName + fileName)))
                            {
                                using (FileStream streamWriter = File.Create(TargetDirectory + directoryName + fileName))
                                {
                                    int size = 2048;
                                    byte[] data = new byte[2048];
                                    while (true)
                                    {
                                        size = zipfiles.Read(data, 0, data.Length);
    
                                        if (size > 0)
                                            streamWriter.Write(data, 0, size);
                                        else
                                            break;
                                    }
                                    streamWriter.Close();
                                }
                            }
                        }
                    }
    
                    zipfiles.Close();
                }
            }
  • 相关阅读:
    Tag文件使用
    微信开发 select选择框
    useGeneratedKeys的用法
    IBM MQ8.0常用操作
    C++对象在继承情况下的内存布局---多态实现的原理
    C++中的赋值操作符重载和拷贝构造函数
    C++中多态的概念和意义
    C 链表冒泡排序
    js 倒计时(可自定义时间)
    如何分析解决Android ANR
  • 原文地址:https://www.cnblogs.com/jiangshuai52511/p/9430657.html
Copyright © 2011-2022 走看看