.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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章