2016-04-12 20 views
0

私は複数のクライアントで実行される私の会社のシステムの更新を作成しています。私は古い設定ファイルと新しいバージョンの2つの設定ファイルを持っています。 両方のファイルを比較して差異をチェックして、最初のファイルで新しいファイルを古いファイルに追加する方法はありますか? ファイルには異なる情報があり、追加/変更する必要があるのはキーのみです。たとえば、キーが異なる場合、古いバージョンをその新しい「バージョン」に変更します。古いファイルにキーが存在しない場合は、それを追加します。Cで設定ファイルを更新する

これらのキーの名前はまったく同じですが、値が異なる場合があります。あなたが見ることのためにプラスdoesntの古いファイルに存在し、私はそれを

を追加する必要があり、新しいキーがあるかもしれない私は、任意の助けをいただければ幸い、

のファイルの例を残します。

<configuration> 
    <appSettings> 
    <add key="ORCASRV1"   value="ORCA30|tcp://127.0.0.1:9001" /> 
    <add key="ORCASRV2"   value="REORCA30|tcp://127.0.0.1:9001" /> 
    <add key="ServidorEmail"  value="xxx" /> 
    <add key="SqlTrans"   value="1" /> 
    <add key="RemoteType"   value="0" /> 
    <add key="LocalPort"   value="9002" /> 
    <add key="LocalMsgStore"  value="1" /> 
    <add key="sqlCHAR_TO_DATA"  value="CONVERT(datetime, '#MM#/#DD#/#YYYY#')" /> 
    <add key="sqlDATA_TO_CHAR"  value="CONVERT(char(30), #CAMPO#)" /> 
    <add key="sqlDATAPARTE"  value="LTRIM(STR(DATEPART(#PARTE, #CAMPO#)))" /> 
    <add key="sqlNUM_TO_CHAR"  value="LTRIM(STR(#VALOR#))" /> 
    <add key="sqlSYSDATE"   value=" GetDate() " /> 
    <add key="sqlALIAS"   value=" As " /> 
    <add key="sqlCONCATENAR"  value="+" /> <add key="sqlNULL"    value="IsNull(#CAMPO#,#VALOR#)" /> 
    <add key="sqlROUND"   value="ROUND(#CAMPO#,#PARTE#)" /> 
    <add key="sqlLPAD"    value="RIGTH(REPLICATE('#CHAR#',#VEZES#)+#CAMPO#,#VEZES#)" /> 
    <add key="oraCHAR_TO_DATA"  value="TO_DATE('#MM#/#DD#/#YYYY#','MM/DD/YYYY')" /> 
    <add key="oraDATA_TO_CHAR"  value="TO_CHAR(#CAMPO#, 'DD/MM/YYYY')" /> 
    <add key="oraDATAPARTE"  value="TO_CHAR(#PARTE#, #CAMPO#)" /> 
    <add key="oraNUM_TO_CHAR"  value="TO_CHAR(#VALOR#)" /> 
    <add key="oraSYSDATE"   value=" SYSDATE " /> 
    <add key="oraALIAS"   value=" " /> 
    <add key="oraCONCATENAR"  value="||" /> 
    <add key="oraNULL"    value="NVL(#CAMPO#,#VALOR#)" /> 
    <add key="oraROUND"   value="ROUND(#CAMPO#,#PARTE#)" /> 
    <add key="oraLPAD"    value="LPAD(#CAMPO#,#VEZES#,#CHAR#)" /> 
    <add key="EmailCDP"   value="[email protected]" /> 
    <add key="EmailCliente"  value="xxx" /> 
    <add key="RPT_PATH1"   value="C:\PROD\ORCAREPORT\" /> 
    <add key="StartPage_Height" value="90" /> 
    <add key="StartPage_Margem" value="220" /> 
    <add key="StartPage_Espaco" value="5" /> 
    <add key="StartPage_Intervalo" value="2" /> 
    <add key="StartPage_Mais"  value="35" /> 
    <add key="HelpExec"   value="WINHLP32.EXE" /> 
    <add key="HelpFile"   value="ORCA.HLP" /> 
    <add key="LogLevel"   value="0" /> 
    <add key="LogSqlClient"  value="0" /> 
    <add key="LogFile"    value="C:\cdpsi\logs" /> 
    </appSettings> 
    <system.runtime.remoting> 
    <application> 
     <channels> 
     <channel ref="tcp" port="9002"> 
      <clientProviders> 
      <formatter ref="binary" />   <provider type="CdpCompress.CompressionClientSinkProvider, CdpCompress" /> 
      </clientProviders> 
     </channel> 
     </channels> 
    </application> 
    </system.runtime.remoting> 
</configuration> 
+0

二つの異なるキーが関連している場合はどのようにあなたが知っているだろうか?それらはファイル内の同じ位置にありますか、値は同じですか?新しいキーか、名前が変更されたキーとなる可能性のあるものをどうやって曖昧にするのですか? –

+0

これらのキーはまったく同じ名前ですが、異なる値を持つことがあります。 さらに、古いファイルには存在しない新しいキーが存在する可能性があり、追加する必要があります –

+1

これをプログラムで行う理由は何ですか?設定ファイルが毎日変更されない限り、それは無意味なスクリプトの総称です。ほんの一瞬のことで、windiffを使ってファイルを比較し、手動でキーを追加/更新してみませんか? – jitendragarg

答えて

0

コードは次のように行って、それが魔法のように動作:

public void UpdateService(string FilePathOld, string FilePathNew, string LatestVersion) 
{ 
     Dictionary<string, string> Old = new Dictionary<string, string>(); 
     Dictionary<string, string> New = new Dictionary<string, string>(); 

     if (ExisteFicheiro(FilePathNew) == true && ExisteFicheiro(FilePathOld) == true) 
     { 
      ExeConfigurationFileMap configOld = new ExeConfigurationFileMap(); 
      configOld.ExeConfigFilename = FilePathOld; 
      Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configOld, ConfigurationUserLevel.None); 

      ExeConfigurationFileMap configNew = new ExeConfigurationFileMap(); 
      configNew.ExeConfigFilename = FilePathNew; 
      Configuration config2 = ConfigurationManager.OpenMappedExeConfiguration(configNew, ConfigurationUserLevel.None); 

      KeyValueConfigurationCollection settings = config.AppSettings.Settings; 
      Old = settings.AllKeys.ToDictionary(key => key, key => settings[key].Value); 
      KeyValueConfigurationCollection settings2 = config2.AppSettings.Settings; 
      New = settings2.AllKeys.ToDictionary(key => key, key => settings2[key].Value); 

      foreach (var NewKey in New) 
      { 
       string value; 
       if (Old.TryGetValue(NewKey.Key, out value)) 
       { 
        if (value != NewKey.Value) 
        { 
         //if (ExistsKey(NewKey.Key, false) == true) 
         Old[NewKey.Key] = NewKey.Value; 

        } 
       } 
       else 
       { 
        Old.Add(NewKey.Key, NewKey.Value); 
       } 
      } 

      foreach (var NewKey in Old) 
      { 
       string key = NewKey.Key; 
       string value = NewKey.Value; 
       if (config.AppSettings.Settings[key] != null) 
       { 
        config.AppSettings.Settings[key].Value = value; 
        if (key == "Version") 
         config.AppSettings.Settings[key].Value = LatestVersion; 
       } 
       else 
       { 
        config.AppSettings.Settings.Add(key, value); 

       } 
       if (config.AppSettings.Settings["Version"] == null) 
       { 
        config.AppSettings.Settings.Add("Version", LatestVersion); 
       } 

      } 
      config.Save(); 
     } 
     else 
     { 
      Erro NovoErro = new Erro(); 
      Global.Erro = "O ficheiro \"OrcaService.exe.config\" ou o ficheiro \"Orca.exe.config\" não existem nos caminhos especificados!"; 
     } 

} 
関連する問題