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解析为字典,并将新字典与旧字典进行比较。您如何保持操作配置,“内部”是如何实现的?