绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
.Net开发的系统安装或更新时如何避免覆盖用户自定义的配置
2023-01-12 16:54:25

我们开发的系统,有时候会包含一些配置信息,需要用户在系统安装后自己去设置,例如我们有一个GPExSettings.xml文件,内容如下。

<GPExSettings ArcPythonPath="C:\Python27\ArcGIS10.8\python.exe" IsUseArcPython="False" />

正常情况下,用户安装了系统,使用过程中,会对系统进行一些设置,即修改了GPExSettings.xml文件。过段时间,如果系统更新了,无论是卸载后再重新安装,还是直接安装系统进行更新,都会把GPExSettings.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]部分设置了开始菜单、卸载菜单以及桌面图标。如果你想设置GPExSettings.xml文件在部署的时候,通过安装目录下有同名文件,可以选择不覆盖,这个我在网上查了下,添加上一个命令就可以了。但如果有好几个这样的文件,还是比较麻烦的。如果用户先卸载了旧版本,就会把打包的时候,包含的所有文件都卸载掉。那这样是不是还要加上一条命令,卸载的时候不要把GPExSettings.xml文件卸载掉?

这样的话,感觉太麻烦了,而且我还是想优先保障打包脚本的简单性,不想搞那么复杂,这种靠命令式的脚本,总感觉不那么灵活,所以我们就在代码中想办法。

2、在代码中解决

我们可以在代码中创建GPExSettings_Bak.xml文件,可以称该文件为GPExSettings.xml的初始或者备份文件。代码在读取GPExSettings.xml内容的时候,先判断GPExSettings.xml文件是否存在,如果存在,则直接读取,不存在,则拷贝GPExSettings_Bak.xml文件,重新命名为GPExSettings.xml,再读取。

并且打包的时候,不要把GPExSettings.xml打进去,只打包GPExSettings_Bak.xml文件,这样就不会存在安装更新包会把用户设置后的GPExSettings.xml给覆盖掉,也不会出现卸载的时候把GPExSettings.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[];
        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中大型研发必备
创建时间:2022-04-09 00:21:16
本系列文章适合有初/.NET知识的同学阅读(请在电脑上打开页面,获取更好的阅读效果)。 (1)本系列文章,旨在讲述研发一个中大型项目所需要了解的一系列“基本构件”,并提供这些“基本构件”在全网的【简单】、【快速】使用方法!!(并不深究技术原理) (2)通过阅读本系列文章,能让你在“正规”项目研发方面快速入门+进阶,并能达成“小团队构建大网站”的目的。 (3)本系列文章采用的技术,已成功应用到人工智能、产业互联网、社区电商、游戏、金融风控、智慧医疗、等项目上。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 红色侦察兵
    栈主

小栈成员

查看更多
  • miemieMIA
  • LCR_
  • xsy028
  • ?时光与海?
戳我,来吐槽~