1

.Net开发的系统安装或更新时如何避免覆盖用户自定义的配置 - mytudousi

 1 year ago
source link: https://www.cnblogs.com/mytudousi/p/17047059.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

.Net开发的系统安装或更新时如何避免覆盖用户自定义的配置

我们开发的系统,有时候会包含一些配置信息,需要用户在系统安装后自己去设置,例如我们有一个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[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);
    }
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK