博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#使用ICSharpCode.SharpZipLib.dll压缩文件夹和文件
阅读量:4938 次
发布时间:2019-06-11

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

大家可以到 下载SharpZiplib的最新版本,本文使用的版本为0.86.0.518,支持Zip, GZip, BZip2 和Tar格式,其实没啥好说的直接上代码

/// /// Zip压缩与解压缩/// public 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 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();        }    } }

 

代码来自网络,略作修改,修改为静态方法,修改文件夹递归压缩时的bug..

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

你可能感兴趣的文章
数据类型
查看>>
ACM基础训练题解4301 城市地平线
查看>>
Python基础练习
查看>>
《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化...
查看>>
python 中的匿名函数lamda和functools模块
查看>>
full gc频繁的分析及解决案例
查看>>
_17NOIP考后随笔
查看>>
centos 7中编译安装httpd-2.4.25.tar.gz
查看>>
第一个一万行程序
查看>>
zeroclipboard复制插件兼容IE8
查看>>
Mina学习之IoHandler
查看>>
电脑配置Java环境变量之后,在cmd中仍然无法识别
查看>>
apue编译方法(收集整合)
查看>>
MAC下安装nginx(转载)
查看>>
leetcode 572. 另一个树的子树(Subtree of Another Tree)
查看>>
慎用preg_replace危险的/e修饰符(一句话后门常用)
查看>>
vuex 完全复制https://blog.csdn.net/u012149969/article/details/80350907
查看>>
获取某地的经纬度 && 通过经纬度获取相应的地理位置
查看>>
一道C题目
查看>>
Process.StandardOutput
查看>>