zoukankan      html  css  js  c++  java
  • C#制作CAB压缩包压缩解压类

    以下为引用的内容:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Diagnostics;

    namespace Com.ImYan.CabHelper
    {
        /// <summary>
        /// CAB文件压缩解压类
        /// </summary>
        public class Cab
        {
            
            #region 属性列表 Properties

            private string _cabFileName;
            /// <summary>
            /// 生成或者解压的Cab文件路径
            /// </summary>
            public string CabFileName
            {
                get { return _cabFileName; }
                set { _cabFileName = value; }
            }

            private List<string> _fileList=new List<string>();
            /// <summary>
            /// “将被压缩”或者“解压出”的文件列表
            /// </summary>
            public List<string> FileList
            {
                get { return _fileList; }
                set { _fileList = value; }
            }

            /// <summary>
            /// 临时目录
            /// </summary>
            private string TempDir;

            #endregion

            #region 构造函数 Structure

            public Cab()
            {
                //指定并创建临时目录
                this.TempDir = Environment.GetFolderPath(Environment.SpecialFolder.Templates);
                this.TempDir = string.Format("{0}\\CabTemp\\", this.TempDir);
                //如果存在,先删除
                if (Directory.Exists(this.TempDir)) Directory.Delete(this.TempDir,true);
                Directory.CreateDirectory(this.TempDir);
            }

            #endregion

            #region 私有方法列表 Private Methods

            /// <summary>
            /// 生成 list.txt 文件
            /// </summary>
            private string CreateListFile()
            {
                try
                {
                    string listFilePath = Path.Combine(this.TempDir, "list.txt");
                    string listContent = string.Empty;//文件内容
                    for (int i = 0; i < this.FileList.Count; i++)
                    {
                        listContent += string.Format("\"{0}\"\r\n", this.FileList[i]);
                    }
                    using (FileStream fs = new FileStream(listFilePath, FileMode.Create, FileAccess.Write))
                    {
                        StreamWriter sw = new StreamWriter(fs, Encoding.Default);
                        sw.Write(listContent);
                        sw.Flush();
                        sw.Close();

                        fs.Close();
                    }

                    return listFilePath;
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
            }

            /// <summary>
            /// 执行CMD命令
            /// </summary>
            private string RunCommand(string cmdString)
            {
                Process p = new Process();
                //启动DOS程序
                p.StartInfo.FileName = "cmd.exe";
                p.StartInfo.UseShellExecute = false;//不用Shell启动
                p.StartInfo.RedirectStandardInput = true;//重定向输入
                p.StartInfo.RedirectStandardOutput = true;//重定向输出
                p.StartInfo.CreateNoWindow = true;//不显示窗口
                p.Start();//开始进程
                p.StandardInput.WriteLine(cmdString);// 向cmd.exe输入command
                p.StandardInput.WriteLine("exit");//结束
                p.WaitForExit(60000);//等等执行完成
                string outPutString = p.StandardOutput.ReadToEnd();// 得到cmd.exe的输出
                p.Close();
                return outPutString;
            }

            /// <summary>
            /// 分析并找到cab文件,然后提取到输出目录
            /// </summary>
            private void MoveCabFile()
            {
                string cabFilePath = string.Empty;

                List<string> allFilesInTempDir = this.GetFilesFromDir(this.TempDir);
                foreach (string file in allFilesInTempDir)
                {
                    if (Path.GetExtension(file).ToLower() == ".cab")
                    {
                        cabFilePath = file;
                        break;
                    }
                    else
                    {
                        //否则删除之
                        File.Delete(file);
                    }
                }

                //转移文件
                File.Move(cabFilePath, this.CabFileName);
            }

            /// <summary>
            /// 从指定目录读取文件列表
            /// </summary>
            /// <param name="dir">要搜索的目录</param>
            /// <param name="filters">后缀列表</param>
            /// <returns></returns>
            private List<string> GetFilesFromDir(string dir)
            {
                List<string> files = new List<string>(Directory.GetFiles(dir));

                List<string> dirs = new List<string>(Directory.GetDirectories(dir));
                foreach (string childDir in dirs)
                {
                    files.AddRange(this.GetFilesFromDir(childDir));
                }

                return files;
            }

            /// <summary>
            /// 从DOS命令返回的结果,分析并得到解压后的文件列表
            /// </summary>
            /// <param name="cmdResult">DOS返回的结果</param>
            private void GetExpandedFileByCmdResult(string cmdResult)
            {
                //文件列表
                this._fileList = new List<string>();

                //分割结果
                string[] resultRowList = cmdResult.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

                //关键字
                string keyString = string.Format("将 {0} 展开成",this.CabFileName.ToLower());
                foreach (string resultRow in resultRowList)
                {
                    if (resultRow.Trim().StartsWith(keyString))
                    {
                        string filePath = resultRow.Replace(keyString, "").Trim().Replace("。", "");
                        if (File.Exists(filePath))
                        {
                            this._fileList.Add(filePath);
                        }
                    }
                }
            }

            #endregion

            #region 公有方法列表 Public Methods

            /// <summary>
            /// 制作CAB文件
            /// 【执行此方法前请先指定“FileList”属性的值】
            /// </summary>
            /// <param name="errorInfo">返回的错误信息</param>
            /// <returns>是否成功</returns>
            public bool MakeCab(out string errorInfo)
            {
                errorInfo = string.Empty;

                try
                {
                    //第一步:写临时文件  list.txt
                    string listFile = this.CreateListFile();
                    if (File.Exists(listFile) == false) throw new Exception("生成文件  list.txt  失败!");

                    //第二步:执行CMD命令
                    string cmdString = "makecab /F list.txt";
                    string cmdResult = this.RunCommand(cmdString);

                    //第三步:分析并找到cab文件,然后提取到输出目录
                    this.MoveCabFile();

                    if (File.Exists(this.CabFileName))
                    {
                        return true;
                    }
                    else
                    {
                        errorInfo = string.Format("文件 {0} 生成失败!", this.CabFileName);
                        return false;
                    }
                }
                catch (Exception ex)
                {
                    errorInfo = ex.Message;
                    return false;
                }
            }

            /// <summary>
            /// 解压缩CAB文件
            /// 【执行此方法前请先指定“CabFileName”属性的值】
            /// </summary>
            /// <param name="errorInfo">返回的错误信息</param>
            /// <returns>是否成功</returns>
            public bool ExpandCab(out string errorInfo)
            {
                errorInfo = string.Empty;

                try
                {
                    //第一步:检查源文件和目录文件夹
                    if (File.Exists(this.CabFileName) == false) throw new Exception("CAB源文件不存在!请指定正确的CabFileName的值!");
                    if (Directory.Exists(this.TempDir) == false) Directory.CreateDirectory(this.TempDir);

                    //第二步:执行CMD命令
                    string tempPath = this.TempDir.EndsWith("\\") ? this.TempDir.Substring(0, this.TempDir.Length - 1) : this.TempDir;
                    string cmdString = string.Format("expand \"{0}\" \"{1}\" -f:*", this.CabFileName, tempPath);
                    string cmdResult = this.RunCommand(cmdString);

                    //第三步:分析得到解压的文件列表
                    this.GetExpandedFileByCmdResult(cmdResult);

                    return true;
                }
                catch (Exception ex)
                {
                    errorInfo = ex.Message;
                    return false;
                }
            }

            #endregion
        }
    }

  • 相关阅读:
    常用的汇编指令与技巧
    汇编调用c函数为什么要设置栈
    lp2356
    String函数的总结
    2019-5-22训练
    STL——substr
    STL 反转函数 (reverse() )
    2019-5-15训练——深搜
    高精度加法
    八皇后题解
  • 原文地址:https://www.cnblogs.com/zjoch/p/1964074.html
Copyright © 2011-2022 走看看