zoukankan      html  css  js  c++  java
  • 文件压缩帮助类

    /// <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解压工具!");
                }
    
            }
        }
  • 相关阅读:
    Python 面向对象高级编程
    Python 继承和多态
    Python 访问限制
    学习笔记项目3-Django-管理网站
    学习笔记项目2-Django-创建数据库及应用
    学习笔记项目1-Django-创建虚拟环境和项目
    写一个 100 以内的奇数列表
    给一个字符串,转换成数字整数,若包含非法字符,返回提示,正确则反回整数值,不能使用内置函数转换
    Linux系统实现一个everything程序
    自动化测试常用脚本-等待某个元素是否显示
  • 原文地址:https://www.cnblogs.com/tianxiaziwei/p/5653349.html
Copyright © 2011-2022 走看看