文件文件夹压缩解压工具类

需引用:ICSharpCode.SharpZipLib.dll

下载地址:http://download.csdn.net/download/u014117094/10017257


/**

* 名称: 文件文件夹压缩解压工具类
* 作者: 
* 时间: 2017.08.15
* 版本: 1
* 说明: 文件文件夹压缩解压工具类
*       
* 历史:
* 版本    时间   修改人    说明
* 1       2017.08.15             lizhongxiang      文件文件夹压缩解压工具类
*/


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


namespace tysoft
{
    public class ZipHelper
    {


        /// <summary>
        /// 压缩单个文件
        /// </summary>
        /// <param name="fileToZip">被压缩的文件名称(包含文件路径)</param>
        /// <param name="zipedFile">压缩后的文件名称(包含文件路径)</param>
        /// <param name="compressionLevel">压缩率0(无压缩)-9(压缩率最高)</param>
        public static void ZipFile(string fileToZip, string zipedFile, int compressionLevel)
        {
            //如果文件没有找到,则报错 
            if (!File.Exists(fileToZip))
            {
                throw new FileNotFoundException("文件:" + fileToZip + "没有找到!");
            }


            if (zipedFile == string.Empty)
            {
                zipedFile = Path.GetFileNameWithoutExtension(fileToZip) + ".zip";
            }


            if (Path.GetExtension(zipedFile) != ".zip")
            {
                zipedFile = zipedFile + ".zip";
            }


            如果指定位置目录不存在,创建该目录
            //string zipedDir = ZipedFile.Substring(0,ZipedFile.LastIndexOf("\\"));
            //if (!Directory.Exists(zipedDir))
            //    Directory.CreateDirectory(zipedDir);


            //被压缩文件名称
            string filename = fileToZip.Substring(fileToZip.LastIndexOf('\\') + 1);


            FileStream streamToZip = new FileStream(fileToZip, FileMode.Open, FileAccess.Read);
            FileStream zipFile = File.Create(zipedFile);
            ZipOutputStream zipStream = new ZipOutputStream(zipFile);
            ZipEntry zipEntry = new ZipEntry(filename);
            zipStream.PutNextEntry(zipEntry);
            zipStream.SetLevel(compressionLevel);
            byte[] buffer = new byte[2048];
            Int32 size = streamToZip.Read(buffer, 0, buffer.Length);
            zipStream.Write(buffer, 0, size);
            try
            {
                while (size < streamToZip.Length)
                {
                    int sizeRead = streamToZip.Read(buffer, 0, buffer.Length);
                    zipStream.Write(buffer, 0, sizeRead);
                    size += sizeRead;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                zipStream.Finish();
                zipStream.Close();
                streamToZip.Close();
            }
        }






        /// <summary>
        /// 压缩文件夹的方法
        /// </summary>
        /// <param name="dirToZip">被压缩的文件路径</param>
        /// <param name="zipedFile">压缩后的文件名称(包含文件路径)</param>
        /// <param name="compressionLevel">压缩率0(无压缩)-9(压缩率最高)</param>
        public static void ZipDir(string dirToZip, string zipedFile, int compressionLevel)
        {
            //压缩文件为空时默认与压缩文件夹同一级目录
            if (zipedFile == string.Empty)
            {
                zipedFile = dirToZip.Substring(dirToZip.LastIndexOf("\\") + 1);
                zipedFile = dirToZip.Substring(0, dirToZip.LastIndexOf("\\")) + "\\" + zipedFile + ".zip";
            }


            if (Path.GetExtension(zipedFile) != ".zip")
            {
                zipedFile = zipedFile + ".zip";
            }


            using (ZipOutputStream zipoutputstream = new ZipOutputStream(File.Create(zipedFile)))
            {
                zipoutputstream.SetLevel(compressionLevel);
                Crc32 crc = new Crc32();
                Hashtable fileList = GetAllFies(dirToZip);
                foreach (DictionaryEntry item in fileList)
                {
                    FileStream fs = File.OpenRead(item.Key.ToString());
                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    ZipEntry entry = new ZipEntry(item.Key.ToString().Substring(dirToZip.Length + 1));
                    entry.DateTime = (DateTime)item.Value;
                    entry.Size = fs.Length;
                    fs.Close();
                    crc.Reset();
                    crc.Update(buffer);
                    entry.Crc = crc.Value;
                    zipoutputstream.PutNextEntry(entry);
                    zipoutputstream.Write(buffer, 0, buffer.Length);
                }
            }
        }






        /// <summary>
        /// 获取所有文件
        /// </summary>
        /// <returns></returns>
        private static Hashtable GetAllFies(string dir)
        {
            Hashtable filesList = new Hashtable();
            DirectoryInfo fileDire = new DirectoryInfo(dir);
            if (!fileDire.Exists)
            {
                throw new FileNotFoundException("目录:" + fileDire.FullName + "没有找到!");
            }


            GetAllDirFiles(fileDire, filesList);
            GetAllDirsFiles(fileDire.GetDirectories(), filesList);
            return filesList;
        }


        /// <summary>
        /// 获取一个文件夹下的所有文件夹里的文件
        /// </summary>
        /// <param name="dirs"></param>
        /// <param name="filesList"></param>
        private static void GetAllDirsFiles(DirectoryInfo[] dirs, Hashtable filesList)
        {
            foreach (DirectoryInfo dir in dirs)
            {
                foreach (FileInfo file in dir.GetFiles("*.*"))
                {
                    filesList.Add(file.FullName, file.LastWriteTime);
                }
                GetAllDirsFiles(dir.GetDirectories(), filesList);
            }
        }


        /// <summary>
        /// 获取一个文件夹下的文件
        /// </summary>
        /// <param name="dir">目录名称</param>
        /// <param name="filesList">文件列表HastTable</param>
        private static void GetAllDirFiles(DirectoryInfo dir, Hashtable filesList)
        {
            foreach (FileInfo file in dir.GetFiles("*.*"))
            {
                filesList.Add(file.FullName, file.LastWriteTime);
            }
        }




        /// <summary>
        /// 功能:解压zip格式的文件。
        /// </summary>
        /// <param name="zipFilePath">压缩文件路径</param>
        /// <param name="unZipDir">解压文件存放路径,为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹</param>
        /// <returns>解压是否成功</returns>
        public static void UnZip(string zipFilePath, string unZipDir)
        {
            if (zipFilePath == string.Empty)
            {
                throw new Exception("压缩文件不能为空!");
            }
            if (!File.Exists(zipFilePath))
            {
                throw new FileNotFoundException("压缩文件不存在!");
            }
            //解压文件夹为空时默认与压缩文件同一级目录下,跟压缩文件同名的文件夹
            if (unZipDir == string.Empty)
                unZipDir = zipFilePath.Replace(Path.GetFileName(zipFilePath), Path.GetFileNameWithoutExtension(zipFilePath));
            if (!unZipDir.EndsWith("\\"))
                unZipDir += "\\";
            if (!Directory.Exists(unZipDir))
                Directory.CreateDirectory(unZipDir);


            using (ZipInputStream s = new ZipInputStream(File.OpenRead(zipFilePath)))
            {


                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    string directoryName = Path.GetDirectoryName(theEntry.Name);
                    string fileName = Path.GetFileName(theEntry.Name);
                    if (!string.IsNullOrEmpty(directoryName))
                    {
                        Directory.CreateDirectory(unZipDir + directoryName);
                    }
                    if (directoryName != null && !directoryName.EndsWith("\\"))
                    {
                        directoryName += "\\";
                    }
                    if (fileName != String.Empty)
                    {
                        using (FileStream streamWriter = File.Create(unZipDir + theEntry.Name))
                        {
                            byte[] data = new byte[2048];
                            while (true)
                            {
                                int size = s.Read(data, 0, data.Length);
                                if (size > 0)
                                {
                                    streamWriter.Write(data, 0, size);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }


        public static List<string> GetDirNames(string fileName)
        {
            List<string> doucumentList = new List<string>();
            if (fileName == string.Empty)
            {
                throw new Exception("压缩文件不能为空!");
            }
            if (!File.Exists(fileName))
            {
                throw new FileNotFoundException("压缩文件不存在!");
            }


            
            using (ZipInputStream s = new ZipInputStream(File.OpenRead(fileName)))
            {


                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    string directoryName = Path.GetDirectoryName(theEntry.Name);
                    if (!string.IsNullOrEmpty(directoryName)&&!doucumentList.Contains(directoryName))
                    {
                        doucumentList.Add(directoryName);
                    }
                }


            }
            return doucumentList;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值