5

さて、しばらく前に、他のプログラムの他の構成ファイルを読み取る方法を投稿しました (ここにリンクがあります。前の投稿. なんとかそれを行うことができました. しかし、別の問題があります. シナリオは次のようなものです, 私は2つのプログラムを持っています. プログラムAは構成ファイルからその構成を読み取り、プログラムBはAが読み取った構成ファイルの内容を変更するためにのみ使用されます. 構成ファイルの名前はemail.config です. プログラムABが存在する同じディレクトリにあります. .

問題は、ファイルを開くダイアログを使用して添付ファイルのパスを取得することです。パスが同じディレクトリ内のファイルを指している場合、プログラムは完璧に動作します! ただし、ディレクトリ外のファイルを指している場合は、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;

つまり、チェーンのどこかに null 参照があるということです。それがどれであるかを特定できれば、問題へのポインタが得られるはずです。

于 2009-06-02T11:49:02.247 に答える
0
externalConfig.AppSettings.Settings["SSL"].Value = ssl.ToString();

構成ファイルに「SSL」が含まれていません

このコードを試している人のための私の2cだけです。

于 2010-10-29T13:24:13.817 に答える
0

OpenFileDialog から FileName と Path を取得するために使用しているコードは何ですか?

ファイルへの完全修飾パスですか?

例えば

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

その音によると、保存されるのはファイル名だけなので、アプリケーションは現在のパスのみを見ています。

于 2009-06-02T11:54:41.253 に答える
0

私は同じ問題を抱えていました.名前を変更できる場合は、別の名前で機能させる方法を調査しませんでしたが、もちろん知りたいです。

于 2009-06-02T14:27:01.273 に答える