Не удается найти путь к файлу
Я использую 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 ответ
- Определите полный исполняемый каталог. См. КАК: Определить путь исполняемого приложения. Содержимое применимо к.NET Compact Framework. Обратите внимание, что
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
возвращает местоположение сборки в виде URL, ноSystem.Reflection.Assembly.GetExecutingAssembly().Location
возвращает полный путь или местоположение UNC (см. здесь). - Используйте метод Path.Combine() для объединения строк в результирующий путь.
В результате ваш код может выглядеть так:
var fullPath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
var fullFileName = System.IO.Path.Combine(fullPath, _sFileName);