C#配置文件

好的,所以提前一段时间我发布了如何阅读其他程序的其他配置文件(这里是链接上一篇文章 。我设法做到了。但现在还有另外一个问题。场景是这样的,我有两个程序。程序A从配置文件读取其配置,程序B仅用于修改A读取的配置文件的内容。配置文件的名称是email.config 。它位于程序AB所在的目录中。

问题是我使用打开文件对话框获取附件文件的路径。 如果路径指向同一目录中的文件,则程序运行完美! 但如果它指向目录外的文件,则会抛出System.NullReferenceException类型的exception。

这是代码

private void saveBtn_Click(object sender, EventArgs e) { try { // save everything and close string attachment = attachTxtBox.Text; var configMap = new ExeConfigurationFileMap { ExeConfigFilename = configFileName }; // it throws exception here when // the path points to a file outside the exes directory Configuration externalConfig = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); externalConfig.AppSettings.Settings["ServerAddress"].Value = serverAddr; externalConfig.AppSettings.Settings["Port"].Value = port; externalConfig.AppSettings.Settings["SSL"].Value = ssl.ToString(); externalConfig.AppSettings.Settings["Sender"].Value = senderAddr; externalConfig.AppSettings.Settings["SenderPassword"].Value = password; externalConfig.AppSettings.Settings["Subject"].Value = subject; externalConfig.AppSettings.Settings["AttachmentPath"].Value = attachment; externalConfig.AppSettings.Settings["Body"].Value = messageBody; // Save values in config externalConfig.Save(ConfigurationSaveMode.Full); Application.Exit(); } catch (System.Exception ex) { MessageBox.Show("Error: " + ex.Message); Application.Exit(); } } 

email.config的内容是:

              

我在这做错了什么?

编辑: configFileName的值是“email.config”

好吧,经过近5个小时的调试,我自己想出来了,该死的!

问题是当我使用OpenFileDialog获取文件路径时,它将当前目录更改为在对话框中选择的目录,因此程序找不到配置文件。 我所做的就是将OpenFileDialog的RestoreDirectory属性设置为true,并将其设置为poof

谢谢大家,ChrisF,Eoin Campbell和pablito。

您是通过其完整路径还是仅通过文件名访问该文件?

如果是后者,那么当文件与可执行文件位于同一文件夹中时,这将起作用,但不是。

UPDATE

看起来事情比我想象的要复杂得多,这似乎不是问题 – 请参阅评论。 引发exception的行是:

 externalConfig.AppSettings.Settings["ServerAddress"].Value = serverAddr; 

这意味着在链的某处有一个空引用。 如果你能识别它是什么,那么应该给你一个指向问题的指针。

您使用什么代码从OpenFileDialog返回FileName和Path。

它是文件的完全限定路径吗?

例如

 openFileDialog1.FileName; //Contains "C:\\Path\\To\\The\\File.txt" 

通过它的声音,保存的只是一个文件名,因此您的应用程序只查看当前路径。

我有同样的问题,我不知道这是否可以帮助你,但当我更改配置文件的名称,这是在你的情况下,在另一个文件夹中,.config并且它不再崩溃,在我的我可以更改名称,所以我没有继续调查如何使其与其他名称一起工作,但我当然想知道。

 externalConfig.AppSettings.Settings["SSL"].Value = ssl.ToString(); 

配置文件不包含“SSL”

对于那些尝试此代码的人来说,只是我的2c。