我們開發的系統,有時候會包含一些配置信息,需要用戶在系統安裝後自己去設置,例如我們有一個GPExSettings.xml文件,內容如下。
<GPExSettings ArcPythonPath="C:\Python27\ArcGIS10.8\python.exe" IsUseArcPython="False" />
正常情況下,用戶安裝了系統,使用過程中,會對系統進行一些設置,即修改了GPExSettings.xml文件。過段時間,如果系統更新了,無論是卸載後再重新安裝,還是直接安裝系統進行更新,都會把GPExSettings.xml替換掉,這樣用戶自定義的設置就不見了。
這樣用戶體驗還是比較差的,每次安裝後,都要重新設置一遍,如果只有一兩個設置項還可以,如果很多的話,用戶會瘋掉的。或則你在說明書上寫上,在安裝新版本之前,把安裝目錄下的某個xml文件先拷貝出來,安裝後,再拷貝過去,這樣的傻方案,你還別說,剛畢業沒多長時間的時候,我就跟用戶這麼說過。
開發桌面軟件,我打包的時候使用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文件卸載掉?
這樣的話,感覺太麻煩了,而且我還是想優先保障打包腳本的簡單性,不想搞那麼複雜,這種靠命令式的腳本,總感覺不那麼靈活,所以我們就在代碼中想辦法。
我們可以在代碼中創建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); } }