首页 C#利用批处理实现正在运行的程序自动更新

C#利用批处理实现正在运行的程序自动更新

举报
开通vip

C#利用批处理实现正在运行的程序自动更新C#利用批处理实现正在运行的程序自动更新 关于自动更新,在.NET下面已经是很普通的事情,无非就是在服务器端保存配置好要更新的程序,然后客户端再写一个小程序来检测,有更新的则复制过来.就这么个思路,这么个简单的问题还要占一篇首页?但你可别急,看看我的标题,再慢慢的看下去,或许哪一天,你可能还真的会用得着呢,就算用不着,相信对各位回头温习一下久违的Command也是不错呀! 利用ShareDevelop的ICSharpCode.Core实现了一个插件应用程序,这两天想要弄个自动更新,将更新功能作为插件包括在应用程...

C#利用批处理实现正在运行的程序自动更新
C#利用批处理实现正在运行的程序自动更新 关于自动更新,在.NET下面已经是很普通的事情,无非就是在服务器端保存配置好要更新的程序,然后客户端再写一个小程序来检测,有更新的则复制过来.就这么个思路,这么个简单的问题还要占一篇首页?但你可别急,看看我的标题,再慢慢的看下去,或许哪一天,你可能还真的会用得着呢,就算用不着,相信对各位回头温习一下久违的Command也是不错呀! 利用ShareDevelop的ICSharpCode.Core实现了一个插件应用程序,这两天想要弄个自动更新,将更新功能作为插件包括在应用程序中,本来以为按照上面的思路是很容易实现的,也确实实现了部分,为什么说部分呢,因为主Exe文件没有更新成功啦!想想原因其实也很简单:主Exe本身就在运行,在运行阶段的Exe或DLL是没法复盖的.这下子,这可怎么办?这时一个想法冒出,先将主Exe进程杀掉,然后再复制不成吗?咦,好象是道理哦,自杀了之后,自然可以复制过来呀,但是转念又想,如果主Exe自己都不存在,那后面的复制功能怎么才能执行呢?难不成因为不差钱,有钱能使鬼推磨,帮主Exe一把? 这世界当然是没有鬼的,即使有,它也不可能这么厉害的能帮到主Exe的,在座位上脑子里想的总是自杀再重生这个 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 .Google,Baidu这些大神祭起半天也没有找到好的解决方案,只好退下来.看来只有靠自己自力更生,当然这个不一定行得通,但至少尝试过了…… 不就是复制嘛?就是copy呀,百无头绪当中,我在cmd中(我一般是会开着cmd的), 无意识的敲着copy/?,xcopy/?之类的查看,其中xcopy的帮助还真是提醒了我,请看下面:(繁体系统,粘贴过来的,所以没有转换成简体) XCopyHelp C: >xcopy /? 复制 档案 肢体残疾康复训练教师个人成长档案教师师德档案表人事档案装订标准员工三级安全教育档案 和树状目录. XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W] [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U] [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]rr [/EXCLUDE:file1[+file2][+file3]] source 指定要复制的档案. destination 指定位置或者/以及新档案的名称. /A 只复制设定成保存属性的档案,不要改变属性的设定. /M 只复制设定成保存属性的档案,并清除保存属性. /D:m-d-y 复制在指定日期当天或之後发生变更的档案.如果没有给日期, 只复制那些来源档案日期比目的档案日期为新的档案. /EXCLUDE:file1[+file2][+file3] 指定档案清单字串.每个字串 应该在档案中的不同行.如果有字串对应到要进行复制的档案绝 对路径的任何部分,这个档案会被排除复制.例如,指定字串 obj 或 .obj 的话,会排除所有在 obj 目录下副档名是 .obj 的档案复制. /P 在建立每个目的档案时显示提示. /S 复制每个目录及其包含的子目录,不复制空目录. /E 复制每个目录及其包含的子目录,也复制空目录./S 与 /E 相同,能够用来修改 /T. /V 验证每个新档案. /W 在复制之前提示您按键继续. /C 如果错误发生时也继续复制. /I 如果目的不存在且复制一个以上的档案的话,就假设指定的 目的一定是目录. /Q 在复制时不要显示档名. /F 在复制时显示来源及目的档案的全部档名. /L 显示要复制的档案. /G 允许加密档案复制到不支援加密的 目的地. /H 时复制隐藏档和系统档. /R 覆盖唯读档案. /T 建立目录结构,但不复制其中的档案.不包括空目录及子目录. /T /E 会包括空目录及子目录. /U 只复制已经存在目的位置的档案. /K 复制档案属性.通常 Xcopy 会重设唯读的属性. /N 用所产生的短档名来进行复制. /O 复制档案所有权及 ACL 资讯. /X 复制档案审查设定 (包含 /O). /Y 不要提示您确认是否要覆盖一个已经存在的档案. /-Y 示您确认是否要覆盖一个已经存在的档案. /Z 在可重新开始的模式中复制网路档案. 参数 /Y 可以在 COPYCMD 环境变数中预先设定.但可以在命令列中用 /-Y 参数 来覆盖原有设定. 对哦,xcopy是可以复制更深层次的目录和文件的,那我如果建一个bat文件,执 行的是复制功能,然后再用一个bat来调用他,并且用一个bat文件去杀掉某一个文件, 然后再复制新的,再启动是没有什么问题的吧.试试: 首先,下载园子里jenry的那篇自动更新的源码(); 因为我觉得他这篇自动更新的文章写的简单但实用,再加上有网友在他的基础 上添加了一个aulwriter工具,所以自动更新直接用这个也蛮方便的. 第二步,我添加了一个方法KillSelfThenRun()用于删除正在运行的主Exe,然 后再重启新的主Exe。代码全部粘贴如下: KillSelfThenRun private void KillSelfThenRun() { string strXCopyFiles = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "XCopyFiles.bat"); using (StreamWriter swXcopy = File.CreateText(strXCopyFiles)) { string strOriginalPath = tempUpdatePath.Subst ring(0, tempUpdatePath.Length - 1); swXcopy.WriteLine(string.Format(@" @echo off xcopy /y/s/e/v " + strOriginalPath + " " + Directory.GetCurrentDirectory() +"", AppDomain.CurrentDomain.FriendlyName)); } string filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "killmyself.bat"); using (StreamWriter bat = File.CreateText(filename)) { // 自删除,自啟動 bat.WriteLine(string.Format(@" @echo off :selfkill attrib -a -r -s -h ""{0}"" del ""{0}"" if exist ""{0}"" goto selfkill call XCopyFiles.bat del XCopyFiles.bat del /f/q " + tempUpdatePath+ Environment.NewLine + " rd " + tempUpdatePath +Environment.NewLine + " start " + mainAppExe +Environment.NewLine + " del %0 ", AppDomain.CurrentDomain.FriendlyName)); } // 启动自删除批处理文件 ProcessStartInfo info = new ProcessStartInfo(filename); info.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(info); // 强制关闭当前进程 Environment.Exit(0); } 第三步调用时,原程序本身就有一个Try的做法,就在Catch里面判断一下,如果 出现IOException,就调用这个方法。 点击完成复制更新文件到应用程序目录 private void btnFinish_Click(object sender, System.EventArgs e) { this.Dispose(); //KillSelfThenRun(); try { CopyFile(tempUpdatePath, Directory.GetCurrentDirectory()); System.IO.Directory.Delete(tempUpdatePath, true); } catch (Exception ex) { if (ex.GetType() == typeof(IOException)) { KillSelfThenRun(); } else { MessageBox.Show(ex.Message.ToString()); } } if (true == this.isRun) Process.Start(mainAppExe); } 最后测试,在xp下自身更新通过。 大概就是这样子,源码各位下载上面jenry的那个组件,然后再上KillSelfThen Run()方法就可以使用了。
本文档为【C#利用批处理实现正在运行的程序自动更新】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_496339
暂无简介~
格式:doc
大小:21KB
软件:Word
页数:7
分类:
上传时间:2018-08-13
浏览量:5