Файл не найден Исключение, созданное для файла XML, возможно, вызванное Outlook - PullRequest
1 голос
/ 21 сентября 2010

Я получаю исключение не найденный файл, когда мое приложение вызывается Outlook.Он вызывается, когда электронная почта сохраняется на компьютере, вызываемом приложением, и выполняет действие с сохраненным сообщением.

Мое приложение использует файл XML для хранения настраиваемых параметров, но этот файл не может быть найден при вызове Outlookвыполняет приложение.Если я запускаю программу вручную, то она работает нормально.

Интересная особенность исключения состоит в следующем:

System.IO.FileNotFoundException: Не удалось найти файл 'C: \ Program Files \ CommonФайлы \ System \ MSMAPI \ 1033 \ settingsOpened.xml '.

Почему Outlook считает, что файл находится здесь?Это не путь к файлу, но я уверен, что он связан с Outlook.Я ссылаюсь на путь в коде просто:

XmlDocument xDoc = new XmlDocument();
xDoc.Load("settingsOpened.xml");

Файл находится в той же папке, что и .exe.Я также не хочу жестко задавать полный путь для файлов XML.

Любая помощь будет принята с благодарностью.

Спасибо, Росс

1 Ответ

0 голосов
/ 21 сентября 2010

Из показанного кода я бы предположил, что в качестве места для поиска файла используется текущий путь. Текущий путь немного непредсказуем, поскольку некоторые операции влияют на его значение, и значение сохраняется при каждом вызове. То есть когда другая часть вашего приложения или даже другое приложение устанавливает текущий путь, это значение используется в следующий раз. Для установки текущего пути достаточно использовать общий диалог для поиска определенного файла.

В вашем случае я бы попытался либо

  • укажите путь в явном виде, выведя его из одной из хорошо известных папок (например, путь к приложению пользователя - ищите Environment.GetFolderPath и Environment.SpecialFolder)

или

  • для определения пути относительно пути сборки вашего Dll.

Чтобы найти путь сборки для myType, вы можете использовать следующий код:

String strPath = System.IO.Path.GetDirectoryName(typeof(myType).Assembly.CodeBase);

В любом случае вы должны учитывать, что в новых операционных системах Windows у пользователя нет доступа на запись ко всем путям системного диска.

...