5

好的,所以提前我发布了如何读取其他程序的其他配置文件(这是链接Previous Post。我设法做到了。但现在还有另一个问题。场景是这样的,我有两个程序。程序A从一个配置文件中读取自己的配置,程序B只用来修改A读取的配置文件的内容,配置文件名为email.config,与程序A & B所在目录相同.

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

这是代码

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的内容是:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings file="">
    <clear />
    <add key="ServerAddress" value="" />
    <add key="Port" value="" />
    <add key="Sender" value="" />
    <add key="SenderPassword" value="" />
    <add key="Subject" value="" />
    <add key="AttachmentPath" value="" />
    <add key="Body" value="" />
  </appSettings>
</configuration>

我在这里做错了什么?

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

4

5 回答 5

5

好吧,我自己调试了将近 5 个小时后自己弄清楚了,该死!

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

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

于 2009-06-02T15:05:10.883 回答
2

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

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

更新

看起来事情比我最初想象的要复杂,这似乎不是这里的问题 - 请参阅评论。引发异常的行是:

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

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

于 2009-06-02T11:49:02.247 回答
0

您使用什么代码从 OpenFileDialog 获取文件名和路径。

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

例如

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

听上去,保存的只是一个文件名,所以您的应用程序只在当前路径中查找。

于 2009-06-02T11:54:41.253 回答
0

我遇到了同样的问题,我不知道这是否可以帮助您,但是当我将配置文件的名称(在您的情况下位于另一个文件夹中)更改为 .config 并且它不再崩溃时,在我的如果我可以更改名称,因此我没有继续调查如何使其与其他名称一起使用,但我当然想知道。

于 2009-06-02T14:27:01.273 回答
0
externalConfig.AppSettings.Settings["SSL"].Value = ssl.ToString();

配置文件不包含“SSL”

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

于 2010-10-29T13:24:13.817 回答