文件压缩帮助类

/// <summary>
    /// 压缩文件帮助类
    /// </summary>
    public class ZipHelper
    {
        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="strFile">源文件夹</param>
        /// <param name="strZip">目标文件</param>
        public void ZipFiles(string strFile, string strZip)
        {
            if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar)
                strFile += Path.DirectorySeparatorChar;
            ZipOutputStream s = new ZipOutputStream(File.Create(strZip));
            s.SetLevel(6); // 0 - store only to 9 - means best compression
            zip(strFile, s, strZip);
            s.Finish();
            s.Close();
        }


        /// <summary>
        /// 压缩多个文件到压缩文件
        /// </summary>
        /// <param name="strFile">文件列表</param>
        /// <param name="strZip"></param>
        public void ZipFiles(string[] strFiles, string strZip)
        {
            ZipOutputStream s = new ZipOutputStream(File.Create(strZip));
            s.SetLevel(6); // 0 - store only to 9 - means best compression
            s.Password = "@isino";
            foreach (string file in strFiles)
            {
                FileStream fs = File.OpenRead(file);
                byte[] buffer = new byte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);
                string tempfile = file.Substring(file.LastIndexOf("\") + 1);
                ZipEntry entry = new ZipEntry(tempfile);
                s.PutNextEntry(entry);
                s.Write(buffer, 0, buffer.Length);
            }
            s.Finish();
            s.Close();
        }

        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="strFileName">源文件名</param>
        /// <param name="strZip">目标文件名</param>
        public void ZipFile(string strFileName, string strZip)
        {
            ZipOutputStream s = new ZipOutputStream(File.Create(strZip));
            s.SetLevel(6); // 0 - store only to 9 - means best compression
            FileStream fs = File.OpenRead(strFileName);

            byte[] buffer = new byte[fs.Length];
            fs.Read(buffer, 0, buffer.Length);
            string tempfile = strFileName.Substring(strFileName.LastIndexOf("\") + 1);
            ZipEntry entry = new ZipEntry(tempfile);
            Crc32 crc = new Crc32();
            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);
            s.Finish();
            s.Close();
        }

        private void zip(string strFile, ZipOutputStream s, string staticFile)
        {
            if (strFile[strFile.Length - 1] != Path.DirectorySeparatorChar) strFile += Path.DirectorySeparatorChar;
            Crc32 crc = new Crc32();
            string[] filenames = Directory.GetFileSystemEntries(strFile);
            foreach (string file in filenames)
            {

                if (Directory.Exists(file))
                {
                    zip(file, s, staticFile);
                }
                else // 否则直接压缩文件
                {
                    //打开压缩文件
                    FileStream fs = File.OpenRead(file);

                    byte[] buffer = new byte[fs.Length];
                    fs.Read(buffer, 0, buffer.Length);
                    string tempfile = file.Substring(staticFile.LastIndexOf("\") + 1);
                    ZipEntry entry = new ZipEntry(tempfile);

                    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);
                }
            }
        }

        public string unZipFile(string TargetFile, string fileDir)
        {
            string rootFile = " ";
            try
            {
                //读取压缩文件(zip文件),准备解压缩
                ZipInputStream s = new ZipInputStream(File.OpenRead(TargetFile.Trim()));
                ZipEntry theEntry;
                string path = fileDir;
                //解压出来的文件保存的路径

                string rootDir = " ";
                //根目录下的第一个子文件夹的名称
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    rootDir = Path.GetDirectoryName(theEntry.Name);
                    //得到根目录下的第一级子文件夹的名称
                    if (rootDir.IndexOf("\") >= 0)
                    {
                        rootDir = rootDir.Substring(0, rootDir.IndexOf("\") + 1);
                    }
                    string dir = Path.GetDirectoryName(theEntry.Name);
                    //根目录下的第一级子文件夹的下的文件夹的名称
                    string fileName = Path.GetFileName(theEntry.Name);
                    //根目录下的文件名称
                    if (dir != " ")
                    //创建根目录下的子文件夹,不限制级别
                    {
                        if (!Directory.Exists(fileDir + "\" + dir))
                        {
                            path = fileDir + "\" + dir;
                            //在指定的路径创建文件夹
                            Directory.CreateDirectory(path);
                        }
                    }
                    else if (dir == " " && fileName != "")
                    //根目录下的文件
                    {
                        path = fileDir;
                        rootFile = fileName;
                    }
                    else if (dir != " " && fileName != "")
                    //根目录下的第一级子文件夹下的文件
                    {
                        if (dir.IndexOf("\") > 0)
                        //指定文件保存的路径
                        {
                            path = fileDir + "\" + dir;
                        }
                    }

                    if (dir == rootDir)
                    //判断是不是需要保存在根目录下的文件
                    {
                        path = fileDir + "\" + rootDir;
                    }

                    //以下为解压缩zip文件的基本步骤
                    //基本思路就是遍历压缩文件里的所有文件,创建一个相同的文件。
                    if (fileName != String.Empty)
                    {
                        FileStream streamWriter = File.Create(path + "\" + 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();

                return rootFile;
            }
            catch (Exception ex)
            {
                return "1; " + ex.Message;
            }
        }

        /// <summary> 
        /// 压缩文件 
        /// </summary> 
        /// <param name="sourceFilesPaths">要压缩的文件路径列表</param> 
        /// <param name="compressFileSavePath">压缩文件存放路径</param> 
        /// <param name="compressFileName">压缩文件名(全名)</param> 
        public void CompressFileForReportTable(ArrayList sourceFilesPaths, string compressFileSavePath, string compressFileName)
        {
            String the_rar;
            RegistryKey the_Reg;
            System.Object the_Obj;
            String the_Info;
            ProcessStartInfo the_StartInfo;
            Process the_Process;
            try
            {
                //使用注册表对象获取到WiNRar路径 
                the_Reg = Registry.ClassesRoot.OpenSubKey(@"ApplicationsWinRAR.exeShellOpenCommand");
                the_Obj = the_Reg.GetValue("");
                the_rar = the_Obj.ToString();
                the_Reg.Close();
                the_rar = the_rar.Substring(1, the_rar.Length - 7);
                the_Info = " a    " + compressFileName;
                foreach (object filePath in sourceFilesPaths)
                {
                    the_Info += " " + filePath.ToString();//每个文件路径要与其它的空格隔开 
                }
                the_StartInfo = new ProcessStartInfo();
                the_StartInfo.FileName = the_rar;
                the_StartInfo.Arguments = the_Info;
                the_StartInfo.WindowStyle = ProcessWindowStyle.Normal;//Hidden 隐藏样式 
                the_StartInfo.WorkingDirectory = compressFileSavePath;//获取或设置要启动的进程的初始目录。(RAR存放路径) 
                the_Process = new Process();
                the_Process.StartInfo = the_StartInfo;
                the_Process.Start();
            }
            catch (Exception ex)
            {

            }
        }

        /// <summary>
        /// 解压缩指定的rar文件。
        /// </summary>
        /// <param name="rarFileToDecompress">rar文件(绝对路径)。</param>
        /// <param name="directoryToSave">解压缩保存的目录。</param>
        /// <param name="deleteRarFile">解压缩后删除rar文件。</param>
        public void DecompressRAR(string rarFileToDecompress, string directoryToSave, bool deleteRarFile)
        {
            String the_rar;
            RegistryKey the_Reg;
            Object the_Obj;
            the_Reg = Registry.ClassesRoot.OpenSubKey(@"ApplicationsWinRAR.exeShellOpenCommand");
            the_Obj = the_Reg.GetValue("");
            the_rar = the_Obj.ToString();
            the_Reg.Close();
            the_rar = the_rar.Substring(1, the_rar.Length - 7);

            string winrarExe = the_rar;//需要在指定路径下放入winara.exe的可执行文件在安装目录下可以找到这个文件
            if (new FileInfo(winrarExe).Exists)
            {
                //directoryToSave = CheckDirectoryName(directoryToSave);
                try
                {
                    Process p = new Process();
                    // 需要启动的程序名
                    p.StartInfo.FileName = winrarExe;
                    // 参数
                    string arguments = @"x -inul -y -o+";
                    arguments += " " + rarFileToDecompress + " " + directoryToSave;
                    p.StartInfo.Arguments = arguments;
                    p.Start();//启动
                    while (!p.HasExited)
                    {
                    }
                    p.WaitForExit();
                }
                catch (Exception ee)
                {
                    throw new Exception("压缩文件在解压缩的过程中出现了错误!");
                }
                if (deleteRarFile)
                {
                    File.Delete(rarFileToDecompress);
                }
            }
            else
            {
                throw new Exception("本机上缺少必须的Winrar.exe文件,不能完成相应操作请联系管理员安装WinRar解压工具!");
            }

        }
    }
原文地址:https://www.cnblogs.com/tianxiaziwei/p/5653349.html