记录下关于调用RA冠道解压缩的主题素材,网址设

在新建网站之前,就是要把打包好的项目拷贝一份到IIS指定的路径上,同时,还要为个别目录设置相应的访问权限!

第二次写代码关系到调用RAR实现解压缩了。还是记录下来一下问题。

最近完成了这个小Demo,来分享一下!
上面给了我两天时间,来完成这个小功能
于时我花了半天时间从网络上到处鄱资料,又花了半天时间调试代码,成功之后,终于有了以下一点的经验之谈:

于是就产生了两件事:

第一次是写Demo,试验通过RAR解压缩实现网站升级覆盖。

这里讲一下重要的:
1.用到两个工具,一个是ffmpeg.exe,另一个是mencoder.exe
ffmpeg最新版本的下载地址:
Mencoder新版本的下载地址:

1。拷贝-》[这里我是采用RAR打包,然后解压]

第一次写时遇到的问题记录:

这里有一个重点,网上的文章都没讲到,所以造成有些人运行后没反应,原因是上面路径的下载,有很多版本,不同的版本可能个别参数不同,而网上的文章所用的参数都是用很早的版本写的,所以会造成运行后因参数错误而没有效果
简单处理是:把网上参数在cmd命令行执行一下,这时命令行会报哪个参数错误,把它删了即可!

2。设置权限

1。在XP下,在Web中解压覆盖正在运行的Asp.net程序目录(自身覆盖自身)。出错-》异常是进程内自己无法覆盖自己

2.判断处理成功与失败或是进度是否完成,从异步获取的输出信息判断[包括获取原视频的宽与高]
这里重点在两个委托事件中,详情见以下几行代码

如果是用拷贝方式,关于文件夹Copy,可以参考我的这篇文章:

解决过程是:以为通过创建应用程序域来解决这问题,失败!

亚洲必赢网站登录 1亚洲必赢网站登录 2Code
 1 
 2  private  void StartProcess(string tool)
 3         {
 4             StartProcess(tool, false);
 5         }
 6         private  void StartProcess(string tool,bool onlyCheckInfo)
 7         {
 8             System.Diagnostics.Process p = new System.Diagnostics.Process();
 9             p.StartInfo.FileName = tool;
10             p.StartInfo.Arguments = commandPara;
11             p.StartInfo.UseShellExecute = false;
12             p.StartInfo.RedirectStandardInput = true;
13             p.StartInfo.RedirectStandardOutput = true;
14             p.StartInfo.RedirectStandardError = true;
15             p.StartInfo.CreateNoWindow = false;
16             p.OutputDataReceived  = new System.Diagnostics.DataReceivedEventHandler(p_OutputDataReceived);
17             if (onlyCheckInfo)//只检测文件是否可转换与获到内部宽与高
18             {
19                 p.ErrorDataReceived  = new System.Diagnostics.DataReceivedEventHandler(p_CheckInfoDataReceived);
亚洲必赢网站登录,20             }
21             else
22             {
23                 p.ErrorDataReceived  = new System.Diagnostics.DataReceivedEventHandler(p_ErrorDataReceived);
24             }
25             //开始执行 
26             try
27             {
28                 p.Start();
29                 p.BeginOutputReadLine();
30                 p.BeginErrorReadLine();
31                 p.WaitForExit();
32             }
33             catch (Exception err)
34             {
35                 Console.WriteLine(err.Message);
36             }
37             finally
38             {
39                 p.Close();
40             }
41         }
42         void p_CheckInfoDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
43         {
44             if (!string.IsNullOrEmpty(e.Data))
45             {
46                 if (e.Data.Contains("Stream") && e.Data.Contains("Video:"))//设置原视频窗口大小作为flv视频的宽与高
47                 {
48                     Match match = Regex.Match(e.Data, @", (d )x(d )");
49                     if (match != null)
50                     {
51                         videoWidth = match.Groups[1].Value;
52                         videoHeight = match.Groups[2].Value;
53                     }
54                 }
55                 else if (e.Data.Contains("could not find codec parameters"))//ffmpeg转换失败
56                 {
57                     isCanChangeToFlv = false;
58                     Program.SetDataBase(id, 1, count   1);
59                 }
60             }
61 
62         }
63 
64          void p_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
65         {
66             if (!string.IsNullOrEmpty(e.Data))
67             {
68                 if (e.Data.Contains("video:") && e.Data.Contains("muxing overhead"))//ffmpeg转换完成
69                 {
70                     Program.SetDataBase(id, 2, count   1);
71                     Console.WriteLine("转换完成");
72                 }
73                 Console.WriteLine(e.Data);
74             }
75             
76         }
77 
78          void p_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
79         {
80             if (!string.IsNullOrEmpty(e.Data))
81             {
82                 if (e.Data.Contains("Writing index"))//mencoder转换完成
83                 {
84                     Program.SetDataBase(id, 2, count   1);
85                     Console.WriteLine("转换完成");
86                 }
87                 //else if (e.Data.Contains("Exiting"))//mencoder转换失败
88                 //{
89                 //    Console.WriteLine("转换失败");
90                 //}
91                 Console.WriteLine(e.Data);
92             }
93         }
94 
95 

文件夹复制操作(非递归循环遍历文件夹)

接着把项目放到Win 2003 桌面上,调用解压,能解压,但乱七八糟的不知道解压了什么东西出来了。

本文只讲重点,请结合网络其它文章与本文即可!

原因是:桌面涉及到多个用户问题,放到CDEF盘就正常了。

 

然后把项目放到Win 2003 其它一个盘中,解压正常。


原因应该是:XP的IIS和Win 2003的IIS原理的不同。xp是单进程,2003是多进程。

 

 

为什么我没采用拷贝的方法,前提有两个,就是项目的文件夹有太多,在制作应用程序安装程序时,只能添加文件,而文件夹只能一个一个的新建,太麻烦!要不就要把项目文件放到其它工程里,那通过项目主输出来实现。我也不想放到新工程或集成到工具项目里,麻烦!

第二次就是在做Winform安装包时。

于是,我通过压缩项目文件,当然没有压缩web.config,因为web.config是要修改的,在压缩包里就改不了。所以最后的做法是解压RAR 文件拷贝web.config!

通过调用RAR解压安装项目,出现问题:

关于RAR解压,这里给出一段代码就算解决了:

1。解压路径中带有空格,所以出错,弄了很久才发现。

 

解决就是如果路径有空格,加双引号包起来。

亚洲必赢网站登录 3亚洲必赢网站登录 4RAR解压

2。网上的命令行没有后台运行参数

public bool WARToFoler(string rarFromPath, string rarToPath)
        {
            Process rarPro = new Process();
            rarPro.StartInfo.FileName = AppConfig.SoftSetup_WinRARSystemPath;
            rarPro.StartInfo.Arguments = string.Format(" x  "{0}" "{1}" -o  -r -ibck", rarFromPath, rarToPath);
            rarPro.StartInfo.UseShellExecute = false;
            rarPro.StartInfo.RedirectStandardInput = true;
            rarPro.StartInfo.RedirectStandardOutput = true;
            rarPro.StartInfo.RedirectStandardError = true;
            rarPro.StartInfo.CreateNoWindow = true;
            rarPro.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            rarPro.OutputDataReceived  = new System.Diagnostics.DataReceivedEventHandler(p_OutputDataReceived);
            rarPro.ErrorDataReceived  = new DataReceivedEventHandler(rarPro_ErrorDataReceived);
            rarPro.Start();//解压开始  
            rarPro.BeginOutputReadLine();
            rarPro.BeginErrorReadLine();
            rarPro.WaitForExit();
            rarPro.Dispose();
            return IsOK;
        }
        void rarPro_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (e.Data!=null && e.Data != "")
            {
                outMsg.Text  = "失败:"   e.Data   "rn";
                IsOK = false;
            }
        }
        void p_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
        {
            if (e.Data != null && e.Data != "")
            {
                outMsg.Text ="成功:"   e.Data   "rn";
            }
        }

解决就是单独搜索,最后找到一条“-ibck"

 

 

AppConfig.SoftSetup_WinRARSystemPath这个是就是安装的RAR.exe路径!

发一下代码:

-ibck参数是让解压在后台运行,这样可以不用弹出个解压框!

 

前些天也写过一篇和RAR相关的文章:

亚洲必赢网站登录 5亚洲必赢网站登录 6代码

记录下关于调用RAR解压缩的问题

public bool WARToFoler(string rarFromPath, string rarToPath)
        {
            Process rarPro = new Process();
            rarPro.StartInfo.FileName = AppConfig.SoftSetup_WinRARSystemPath;
            rarPro.StartInfo.Arguments = string.Format(" x  "{0}" "{1}" -o  -r -ibck", rarFromPath, rarToPath);
            rarPro.StartInfo.UseShellExecute = false;
            rarPro.StartInfo.RedirectStandardInput = true;
            rarPro.StartInfo.RedirectStandardOutput = true;
            rarPro.StartInfo.RedirectStandardError = true;
            rarPro.StartInfo.CreateNoWindow = true;
            rarPro.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            rarPro.OutputDataReceived  = new System.Diagnostics.DataReceivedEventHandler(p_OutputDataReceived);
            rarPro.ErrorDataReceived  = new DataReceivedEventHandler(rarPro_ErrorDataReceived);
            rarPro.Start();//解压开始  
            rarPro.BeginOutputReadLine();
            rarPro.BeginErrorReadLine();
            rarPro.WaitForExit();
            rarPro.Dispose();
            return IsOK;
        }
        void rarPro_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (e.Data!=null && e.Data != "")
            {
                outMsg.Text  = "失败:"   e.Data   "rn";
                IsOK = false;
            }
        }
        void p_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)
        {
            if (e.Data != null && e.Data != "")
            {
                outMsg.Text ="成功:"   e.Data   "rn";
            }
        }

 

OK,RAR解压就这么告一段落,接下来,我有一个App_Data目录,由于会往里面写生成的xml,所以为之添加一个可写权限!

 


RAR参数命令我就不弄上来了,听说RAR安装目录的帮助文档下就有:我装的破解版打不开。

 

 

设置权限的方式有三种,一种用net自带的封装类。另一种直接调用cacls.exe实现,还有一种就是网上下的调用Microsoft.win32的某种复杂方式。

以下就用第一种了。用net自带的类实现,非常的简单,三行代码:

 

亚洲必赢网站登录 7亚洲必赢网站登录 8设置权限

System.Security.AccessControl.DirectorySecurity fSec = new DirectorySecurity();
fSec.AddAccessRule(new FileSystemAccessRule("everyone", FileSystemRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
System.IO.Directory.SetAccessControl(path, fSec);

 

这里是添加了一个everyone用户,当然也可以换成aspnet用户,具体看安全性要求给了!后面就给出了所有权限。

具体关于权限的说明,多百google度或在vs下看按F1帮助文档就清楚了!

 

打完,收工!

本文由亚洲必赢娱乐游戏发布于亚洲必赢网站登录,转载请注明出处:记录下关于调用RA冠道解压缩的主题素材,网址设

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。