Не удается найти путь к файлу

Я использую Windows CE 6.0. Я разрабатываю приложение, которому нужно прочитать XML-файл (bar.xml), который находится прямо рядом с моим исполняемым файлом (foo.exe).

Я пытаюсь получить к нему доступ с помощью следующего метода, вызываемого сразу после моего Main():

private void ParseXmlFile(string _sFileName)
{
    XmlDocument l_doc = new XmlDocument();
    l_doc.Load(_sFileName);
}

Теперь при запуске моего приложения из консоли Windows CE с помощью:

foo.exe bar.xml

Все, что я получаю, является исключением, заявляющим: Cound not find file '\bar. Обратите внимание на '\' здесь. Я также попробовал:

foo.exe bar.xml
foo.exe .\bar.xml
foo.exe ./bar.xml

Мое приложение находится в папке \Hard Disk\ftp\Test\

Если я помещаю свой файл в папку "Жесткий диск", все в порядке. Конечно, я не хочу, чтобы мой файл был здесь. Как я могу сказать своему приложению искать этот файл в той же папке, что и мое приложение?

Редактировать:
После комментария от @Thomas я проверил свой путь и увидел, что я действительно находился в правильной папке (\Hard Disk\ftp\Test).

Мне пришлось использовать следующий код, чтобы получить путь (из-за Compact Framework 2.0):

string l_sFullAppName = Assembly.GetCallingAssembly().GetName().CodeBase;
string l_sFullAppPath = Path.GetDirectoryName(l_sFullAppName);

XmlDocument l_doc = new XmlDocument();
l_doc.Load(_l_sFullAppPath + '\\bar.xml');

Это работает, но не кажется мне очень удобным. Есть другие идеи?

1 ответ

Решение
  1. Определите полный исполняемый каталог. См. КАК: Определить путь исполняемого приложения. Содержимое применимо к.NET Compact Framework. Обратите внимание, что System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase возвращает местоположение сборки в виде URL, но System.Reflection.Assembly.GetExecutingAssembly().Location возвращает полный путь или местоположение UNC (см. здесь).
  2. Используйте метод Path.Combine() для объединения строк в результирующий путь.

В результате ваш код может выглядеть так:

var fullPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
var fullFileName = System.IO.Path.Combine(fullPath, _sFileName);
Другие вопросы по тегам