博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#壓縮文件幫助類 使用ICSharpCode.SharpZipLib.dll
阅读量:5118 次
发布时间:2019-06-13

本文共 7859 字,大约阅读时间需要 26 分钟。

using ICSharpCode.SharpZipLib.Checksums;using ICSharpCode.SharpZipLib.Zip;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Threading.Tasks;namespace MakePdf{    ///     /// Zip压缩与解压缩     ///     public static class ZipHelper    {        ///         /// 压缩单个文件        ///         /// 要压缩的文件        /// 压缩后的文件        /// 压缩等级        /// 每次写入大小        public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel, int blockSize)        {            //如果文件没有找到,则报错            if (!System.IO.File.Exists(fileToZip))            {                throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");            }            using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile))            {                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);                        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();            }        }        ///         /// 压缩单个文件        ///         /// 要进行压缩的文件名        /// 压缩后生成的压缩文件名        public static void ZipFile(string fileToZip, string zipedFile)        {            //如果文件没有找到,则报错            if (!File.Exists(fileToZip))            {                throw new System.IO.FileNotFoundException("指定要压缩的文件: " + fileToZip + " 不存在!");            }            using (FileStream fs = File.OpenRead(fileToZip))            {                byte[] buffer = new byte[fs.Length];                fs.Read(buffer, 0, buffer.Length);                fs.Close();                using (FileStream ZipFile = File.Create(zipedFile))                {                    using (ZipOutputStream ZipStream = new ZipOutputStream(ZipFile))                    {                        string fileName = fileToZip.Substring(fileToZip.LastIndexOf("\\") + 1);                        ZipEntry ZipEntry = new ZipEntry(fileName);                        ZipStream.PutNextEntry(ZipEntry);                        ZipStream.SetLevel(5);                        ZipStream.Write(buffer, 0, buffer.Length);                        ZipStream.Finish();                        ZipStream.Close();                    }                }            }        }        ///         /// 压缩多层目录        ///         /// The directory.        /// The ziped file.        public static void ZipFileDirectory(string strDirectory, string zipedFile)        {            using (System.IO.FileStream ZipFile = System.IO.File.Create(zipedFile))            {                using (ZipOutputStream s = new ZipOutputStream(ZipFile))                {                    ZipSetp(strDirectory, s, "");                }            }        }        ///         /// 递归遍历目录        ///         /// The directory.        /// The ZipOutputStream Object.        /// The parent path.        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 文件。        ///         /// The ziped file.        /// The STR directory.        /// zip 文件的密码。        /// 是否覆盖已存在的文件。        public static void UnZip(string zipedFile, string strDirectory, string password, bool overWrite)        {            if (strDirectory == "")                strDirectory = Directory.GetCurrentDirectory();            if (!strDirectory.EndsWith("\\"))                strDirectory = strDirectory + "\\";            using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipedFile)))            {                s.Password = password;                ZipEntry theEntry;                while ((theEntry = s.GetNextEntry()) != null)                {                    string directoryName = "";                    string pathToZip = "";                    pathToZip = theEntry.Name;                    if (pathToZip != "")                        directoryName = Path.GetDirectoryName(pathToZip) + "\\";                    string fileName = Path.GetFileName(pathToZip);                    Directory.CreateDirectory(strDirectory + directoryName);                    if (fileName != "")                    {                        if ((File.Exists(strDirectory + directoryName + fileName) && overWrite) || (!File.Exists(strDirectory + directoryName + fileName)))                        {                            using (FileStream streamWriter = File.Create(strDirectory + directoryName + fileName))                            {                                int size = 2048;                                byte[] data = new byte[2048];                                while (true)                                {                                    size = s.Read(data, 0, data.Length);                                    if (size > 0)                                        streamWriter.Write(data, 0, size);                                    else                                        break;                                }                                streamWriter.Close();                            }                        }                    }                }                s.Close();            }        }    }}

转载于:https://www.cnblogs.com/xuhongfei/p/5605994.html

你可能感兴趣的文章
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
Loj #139
查看>>
hihocoder1187 Divisors
查看>>
Azure 托管镜像和非托管镜像对比
查看>>
js window.open 参数设置
查看>>
032. asp.netWeb用户控件之一初识用户控件并为其自定义属性
查看>>
Ubuntu下安装MySQL及简单操作
查看>>
前端监控
查看>>
clipboard.js使用方法
查看>>
移动开发平台-应用之星app制作教程
查看>>
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>
伪类与超链接
查看>>
centos 7 redis-4.0.11 主从
查看>>
博弈论 从懵逼到入门 详解
查看>>
永远的动漫,梦想在,就有远方
查看>>
springboot No Identifier specified for entity的解决办法
查看>>
慵懒中长大的人,只会挨生活留下的耳光
查看>>
"远程桌面连接--“发生身份验证错误。要求的函数不受支持
查看>>
【BZOJ1565】 植物大战僵尸
查看>>
VALSE2019总结(4)-主题报告
查看>>