.Net开发的系统安装或更新时如何避免覆盖用户自定义的配置
我们开发的系统,有时候会包含一些配置信息,需要用户在系统安装后自己去设置,例如我们有一个GPExSettings.xml文件,内容如下。
<GPExSettings ArcPythonPath="C:\Python27\ArcGIS10.8\python.exe" IsUseArcPython="False" />
正常情况下,用户安装了系统,使用过程中,会对系统进行一些设置,即修改了AppSetting.xml文件。过段时间,如果系统更新了,无论是卸载后再重新安装,还是直接安装系统进行更新,都会把AppSetting.xml替换掉,这样用户自定义的设置就不见了。
这样用户体验还是比较差的,每次安装后,都要重新设置一遍,如果只有一两个设置项还可以,如果很多的话,用户会疯掉的。或则你再说明书上写上,再安装新版本之前,把安装目录下的某某个xml文件先拷贝出来,安装后,再拷贝过去,这样的傻方案,你还别说,这种方案在我刚毕业没多长时间的时候,跟用户这么说过。
1、在打包的时候解决
开发桌面软件,我打包的时候一般使用Inno Setup Compiler工具,但一般都使用里面比较简单的功能,例如设置系统名称、版本号、要打包的文件、桌面图标、开始菜单和卸载菜单等。
Inno Setup Compiler中主要的内容如下。
[Files]
Source: "D:\2022\01GeoChem_2022\代码\打包\Release\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\2022\01GeoChem_2022\代码\打包\DEV\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}";IconFilename: "{app}\App.ico"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{app}\unins000.exe"
Name: "{userdesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "{app}\App.ico";
【Files】部分设置了要打包那些文件夹或者文件,[Icons]部分设置了开始菜单、卸载菜单以及桌面图标。如果你想设置AppSetting.xml文件在部署的时候,通过安装目录下有同名文件,可以选择不覆盖,这个我在网上查了下,添加上一个命令就可以了。但如果有好几个这样的文件,还是比较麻烦的。如果用户先卸载了旧版本,就会把打包的时候,包含的所有文件都卸载掉。那这样是不是还有加上依据命令,卸载的时候不要把AppSetting.xml文件卸载掉?
这样的话,感觉太麻烦了,而且我还是想优先保障打包脚本的简单性,不想搞那么复杂,这种靠命令式的脚本,总感觉不那么灵活,所以我们就在代码中想办法。
2、在代码中解决
我们可以在代码中创建AppSetti文件ng_Bak.xml,我们可以称该文件为AppSetting.xml的初始或者备份文件。代码在读取AppSetting.xml内容的时候,先判断AppSetting.xml文件是否存在,如果存在,则直接读取,不存在,则拷贝AppSetting_Bak.xml文件,重新命名为AppSetting.xml,再读取。
并且打包的时候,不要把AppSetting.xml打[[进去,只打包AppSetti文件ng_Bak.xml,这样就不会存在安装更新包会把用户设置后的AppSetting.xml给覆盖掉,也不会出现卸载的时候把AppSetting.xml文件卸载掉,就达成了我们的目的。
代码如下。
private static readonly string _XmlFilePath = AppDomain.CurrentDomain.BaseDirectory + "Res\\GPExSettings.xml";
private static readonly string _BakXmlFilePath = AppDomain.CurrentDomain.BaseDirectory + "Res\\GPExSettings_Bak.xml";
/// <summary>
/// 执行器的配置信息
/// </summary>
static GPExSettings()
{
if (File.Exists(_XmlFilePath) == false)
{
if (File.Exists(_BakXmlFilePath) == false)
{
throw new ArgumentException("GPExSettings_Bak.xml file not exist.");
}
File.Copy(_BakXmlFilePath, _XmlFilePath);
}
try
{
XmlDocument myXmlD = new XmlDocument();
myXmlD.Load(_XmlFilePath);
XmlNode myXmlNode = myXmlD.ChildNodes[0];
ArcPythonPath = myXmlNode.Attributes["ArcPythonPath"].Value;
IsUseArcPython = Convert.ToBoolean(myXmlNode.Attributes["IsUseArcPython"].Value);
}
catch (Exception ex)
{
throw new ArgumentException("Load GPExSettings.xml fail," + ex.Message);
}
}
.Net开发的系统安装或更新时如何避免覆盖用户自定义的配置的更多相关文章
- poj3468A Simple Problem with Integers(线段树,在段更新时要注意)
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- Android开发配置,消除SDK更新时的“https://dl-ssl.google.com refused”异常
消除SDK更新时的“https://dl-ssl.google.com refused”错误 消除SDK更新时,有可能会出现这样的错误:Download interrupted: hostname i ...
- SQL Server 统计信息更新时采样百分比对数据预估准确性的影响
为什么要写统计信息 最近看到园子里有人写统计信息,楼主也来凑热闹. 话说经常做数据库的,尤其是做开发的或者优化的,统计信息造成的性能问题应该说是司空见惯. 当然解决办法也并非一成不变,“一招鲜吃遍天” ...
- 【Android环境搭建】解决安装使用SDK Manager更新时的问题
问题描述: 安装使用SDK Manager更新时出现问题 Failed to fetch URL https://dl-ssl.google.com/android/repository/repos ...
- checking在浏览器为应用缓存查找更新时触发
离线的Web应用,就是在设备不能上网的时候还能运行应用.html5把离线应用作为重点,主要是开发人员的心愿.离线应用的开发的步骤有:首先应该知道设备是否能够上网;然后应该还能访问一定的资源(如图像.C ...
- Installshield更新时,新加dll未拷贝至安装目录问题完美解决【原创】
最近在发现在开发过程中新增的目录或文件(特别是dll\ocx\exe等二进制文件),在升级安装时拷贝失败. 经过一周的研究,完美解决办法: 对于新增的文件或目录,放到一个新的component中,并且 ...
- 解决Android SDK Manager更新时出现问题
使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xm ...
- 从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件
标题:从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/112 ...
- SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败解决方案
SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败的问题,可作如下尝试: 更新失败后,在windows的[事件查看器→应用程序]中找到来源为MsiInstaller,事件ID为1 ...
- Linux/CentOS配置:使用yum update更新时不升级内核的方法
RedHat/CentOS/Fedora使用 yum update 更新时,默认会升级内核.但有些服务器硬件(特别是组装的机器)在升级内核后,新的内核可能会认不出某些硬件,要重新安装驱动,很麻烦.所以 ...
随机推荐
- XAF新手入门 - 模块(Module)
模块概述 谈到模块大家应该都不会感到陌生,不管是前端还是后端都有模块的概念,XAF中的模块概念与大多数框架中的模块概念是相通的.XAF模块首先是一个.NET类库,同时它还包含一个继承自ModuleBa ...
- 狂神说mysql笔记
1.mysql 基本操作 Windows-->Mysql5.7打开 输入用户名和密码 查看数据库 :show databases:查询所有数据库,记住一定要加分号结尾 这里必须全部为 英文空格 ...
- Redis系列9:Geo 类型赋能亿级地图位置计算
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...
- 检测轮廓 获取其最值的坐标 opencv-python
一.基础知识 图像清晰度评价算法有多种 空域中,主要考察图像的邻域对比度,即相邻像素间灰度特征的 梯度差: 频域中,主要考察图像的频率分量,清晰的图像高频分量多,模糊的图像低频分量多. 灰度值 把白色 ...
- windows socket网络编程--事件选择模型
目录 事件选择模型概述 API详解 工作原理 代码实现 事件选择模型概述 Winsock提供了另一种有用的异步事件通知I/O模型--WSAEventSelect模型.这个模型与WSAAsyncSele ...
- 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes
前言 谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在 Kubernetes 上安装 Jenkins,后续文章会带你深入了解如何使用k8s pod 作为 Jenkins的build ...
- MQTT GUI 客户端 可视化管理工具推荐
一款好用的 MQTT 客户端工具可以极大地提高开发者使用MQTT的效率.MQTT 客户端工具常用于建立与 MQTT 服务器的连接,进行主题订阅.消息收发等操作. 今天,在此推荐一款优秀的MQTT GU ...
- 使用SVN搭建本地版本控制仓库
使用SVN搭载本地版本控制仓库[转] 如果是在公司,都是有云服务器,项目负责人都是把项目放在服务器上,我们直接用SVN地址就可以实现更新和下载项目源码,那么如果我们自己想使用SVN在本机管理自己写的一 ...
- jQuery漏洞复现整理
jQuery DOM-based XSS 免责声明: 本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他应用进行非法操作,若将其用于非法目的,所造成的后果由您自行承担,产生的一切风险与本文作者无 ...
- vue 项目中,后端返回文件流,导出excel
之前写过文件流导出excel,这次直接把上次的代码拿过来复制粘贴,但是导出的表格里面没有数据,只显示undefined. 这是之前的代码 // api接口页面 // excel导出接口 export ...