Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中更新配置文件#_C#_File_Config_Updates_Difference - Fatal编程技术网

C# 在c中更新配置文件#

C# 在c中更新配置文件#,c#,file,config,updates,difference,C#,File,Config,Updates,Difference,我正在为我的公司系统创建一个更新,它将在多个客户端上运行,我有两个配置文件,一个是旧的配置文件,另一个是更新的版本。 是否有任何方法可以比较这两个文件并检查差异,以便将第一个文件中的新内容添加到旧文件中? 请记住,这些文件可能有不同的信息,我唯一需要添加/更改的是密钥。例如,如果密钥不同,则将旧的更改为新的“版本”,如果旧文件中不存在密钥,则添加该密钥 它们的键将具有完全相同的名称,但可能具有不同的值。另外,旧文件中可能不存在新密钥,我需要添加它 我将留下一个文件示例供您查看 任何帮助都将不胜感

我正在为我的公司系统创建一个更新,它将在多个客户端上运行,我有两个配置文件,一个是旧的配置文件,另一个是更新的版本。 是否有任何方法可以比较这两个文件并检查差异,以便将第一个文件中的新内容添加到旧文件中? 请记住,这些文件可能有不同的信息,我唯一需要添加/更改的是密钥。例如,如果密钥不同,则将旧的更改为新的“版本”,如果旧文件中不存在密钥,则添加该密钥


它们的键将具有完全相同的名称,但可能具有不同的值。另外,旧文件中可能不存在新密钥,我需要添加它

我将留下一个文件示例供您查看

任何帮助都将不胜感激

<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="antonio.santos@cdp-si.pt" />
    <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>

代码是这样运行的,它就像一个符咒:

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!";
        }

}
public void UpdateService(字符串FilePathOld、字符串FilePathNew、字符串LatestVersion)
{
字典旧=新字典();
Dictionary New=新字典();
if(ExisteFicheiro(FilePathNew)==true&&ExisteFicheiro(FilePathOld)==true)
{
ExeConfigurationFileMap configOld=新的ExeConfigurationFileMap();
configOld.ExeConfigFilename=FilePathOld;
Configuration config=ConfigurationManager.OpenMappedExeConfiguration(configOld,ConfigurationUserLevel.None);
ExeConfigurationFileMap configNew=新的ExeConfigurationFileMap();
configNew.ExeConfigFilename=FilePathNew;
Configuration config2=ConfigurationManager.OpenMappedExeConfiguration(configNew,ConfigurationUserLevel.None);
KeyValueConfigurationCollection设置=config.AppSettings.settings;
Old=settings.AllKeys.ToDictionary(key=>key,key=>settings[key].Value);
KeyValueConfigurationCollection设置2=config2.AppSettings.Settings;
New=settings2.AllKeys.ToDictionary(key=>key,key=>settings2[key].Value);
foreach(新中的var NewKey)
{
字符串值;
if(旧的.TryGetValue(NewKey.Key,out值))
{
if(值!=NewKey.value)
{
//if(ExistsKey(NewKey.Key,false)=true)
Old[NewKey.Key]=NewKey.Value;
}
}
其他的
{
Old.Add(NewKey.Key,NewKey.Value);
}
}
foreach(旧版本中的var NewKey)
{
字符串key=NewKey.key;
字符串值=NewKey.value;
if(config.AppSettings.Settings[key]!=null)
{
config.AppSettings.Settings[key].Value=Value;
如果(键==“版本”)
config.AppSettings.Settings[key].Value=LatestVersion;
}
其他的
{
config.AppSettings.Settings.Add(键,值);
}
if(config.AppSettings.Settings[“Version”]==null)
{
config.AppSettings.Settings.Add(“版本”,最新版本);
}
}
config.Save();
}
其他的
{
Erro NovoErro=新Erro();
Global.Erro=“O ficheiro\”OrcaService.exe.config\”ou O ficheiro\”Orca.exe.config\”nãO existem nos caminhos specificados!”;
}
}

您如何知道两个不同的键是否相关?它们在文件中的位置是否相同,值是否相同?如何在可能是新键或名称已更改的键之间消除歧义?它们的键将具有完全相同的名称,但可能具有不同的值。另外,旧文件中可能有一个不存在的新密钥,我需要添加它。为什么要以编程方式执行此操作?除非配置文件每天都在更改,否则编写它完全是毫无意义的脚本。有一件事,为什么不使用windiff和手动添加/更新密钥来比较文件呢?我不能手动进行比较,因为当新软件包出现时,会有很多客户端需要更新他们的系统,而我不能在50台机器上手动进行更新,因此程序可以将xml解析为字典,并将新字典与旧字典进行比较。您如何保持操作配置,“内部”是如何实现的?