正在写一个软件自动更新的程序,求高手帮忙解决一个难题 本帖最后由 opika 于 2010-08-14 17:09:01 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 自动更新,根本用不着另外一个软件,自己升级自己就可以了。下载到同名目录下,下载完成后,组合一个bat文件,循环检测自己文件,发现可以删除了。就删除掉。吧下载的文件更名为主程序名,然后运行主程序启动。自升级结束,删除资深bat文件。这么简单的一个逻辑居然弄2个程序… 楼主言之有理,不过我还是更希望我提的问题能得到针对性解决哈~ 谢谢,继续期待 高手 ing~~~ 你的太长。没格式,没仔细看。给你个模拟的范例。一个函数就可以自己实现自我更新,你可以新建一个控制台程序,然后粘贴如下代码,添加对应的引用。就可以了。[STAThread]static void Main(string[] args){ //选择一个文件,进行更新,模拟一下而已。实际对应你的下载过程 OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "更新程序|*.exe||"; if (dlg.ShowDialog() != DialogResult.OK) return; //缓存当前文件绝对路径 string thisPath = Environment.GetCommandLineArgs()[0]; //当前文件更名 FileInfo fi = new FileInfo(thisPath); string tempFile = Regex.Replace(thisPath, @"(?i)(?=\.exe)", "1"); if (File.Exists(tempFile)) File.Delete(tempFile); fi.MoveTo(tempFile); //下载的程序移动并更名为缓存的文件名 File.Move(dlg.FileName,thisPath); //启动下载的程序 Process.Start(thisPath); //退出自己,更新完毕 Environment.Exit(0); Console.ReadKey();} 楼主遇到的问题 IO 操作过程中常见错误:在文件句柄没有被释放的情况下操作该文件,所以系统会报错(进程无法访问文件,因为该文件正由另一个进程占用)。分析一下问题的症结所在:你的主程序在运行中(尽管你已经 Kill 了,但可能你的程序还在运行),此时你尝试覆盖正在运行的可执行文件自然行不通。 通过程序得到需要升级的需求。 关闭,并运行自编的软件,最后,得到这个软件,并覆盖软件。 最后,关闭自动升级软件,并运行软件。可使用web services和XML获取版本信息http://topic.csdn.net/u/20090813/16/1aaa85f4-afee-49a6-abfe-140259d59791.html 哈~~ 谢谢各位的解答~~ 问题已经解决~~原因是由于我在 更新程序 中通过 Assembly.LoadFrom( 主程序绝对路径).GetName().Version.ToString() 的方式来获取主程序本地的版本,所以在替换时,出错那个错误,也就是因为老主程序正被 更新程序调用(通过上面那句代码)。 把上面那句代码去掉了,结果,就可以正常删除或覆盖了再次谢谢各位~结贴~~ 请问:怎样能快速比较两个list数据 求助:windows ce程序如何仿真调试 装了个c#2008,出现了一些问题,请教高人 c# winform DataGridView分页怎么做 如何得到Excel对象 DataGridViewComboBoxColumns手工添加item选项却只能显示第一个? 请问使用ADO.net怎么删除ACCESS数据库中的表? !!!!DataGrid的一个简单问题,先谢谢大家了!!!! 关闭窗体时,如何保证线程池中的线池都执行完毕了? 一个编程新手的问题,请高手们给解决一下 关于匿名委托 winform 连接外网oracle问题
[STAThread]
static void Main(string[] args)
{
//选择一个文件,进行更新,模拟一下而已。实际对应你的下载过程
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "更新程序|*.exe||";
if (dlg.ShowDialog() != DialogResult.OK) return;
//缓存当前文件绝对路径
string thisPath = Environment.GetCommandLineArgs()[0];
//当前文件更名
FileInfo fi = new FileInfo(thisPath);
string tempFile = Regex.Replace(thisPath, @"(?i)(?=\.exe)", "1");
if (File.Exists(tempFile)) File.Delete(tempFile);
fi.MoveTo(tempFile);
//下载的程序移动并更名为缓存的文件名
File.Move(dlg.FileName,thisPath);
//启动下载的程序
Process.Start(thisPath);
//退出自己,更新完毕
Environment.Exit(0);
Console.ReadKey();
}
关闭,并运行自编的软件,最后,得到这个软件,并覆盖软件。
最后,关闭自动升级软件,并运行软件。
可使用web services和XML获取版本信息
http://topic.csdn.net/u/20090813/16/1aaa85f4-afee-49a6-abfe-140259d59791.html
Assembly.LoadFrom( 主程序绝对路径).GetName().Version.ToString()
的方式来获取主程序本地的版本,所以在替换时,出错那个错误,也就是因为老主程序正被 更新程序调用(通过上面那句代码)。
把上面那句代码去掉了,结果,就可以正常删除或覆盖了再次谢谢各位~结贴~~