Рабочий каталог WPF - PullRequest
       0

Рабочий каталог WPF

7 голосов
/ 18 июня 2010

У меня есть приложение WPF, которое устанавливается на клиентский компьютер через установщик Windows. Это приложение также регистрирует расширение файла (.xyz), поэтому, когда пользователь дважды щелкает файл, он открывает мое приложение WPF и отображает файл (например, Microsoft Word). В этой программе также имеется масса файлов, которые не помечены как используемые файлы ресурсов или содержимого (руководства пользователя, чертежи деталей и т. Д.).

Проблема возникает, когда пользователь дважды щелкает файл .xyz и открывает приложение WPF. Теперь в приложении есть рабочий каталог, в котором находится файл .xyz. Теперь программа не может найти нужные файлы (руководства пользователя, чертежи деталей и т. Д.).

Как лучше всего решить проблему такого типа? Я мог бы установить рабочий каталог (Environment.CurrentDirectory), но мое диалоговое окно открытия файла изменяет рабочий каталог, когда пользователь сохраняет или открывает файл .xyz. Я мог бы использовать пакет URI для чертежей деталей, но я использую Process.Start для руководств пользователя, потому что они представляют собой PDF. Я попытался найти, но ничего не смог придумать.

Ответы [ 6 ]

5 голосов
/ 18 июня 2010

Вы можете получить доступ к каталогу установки, либо найдя каталог исполняемого файла, либо используя отражение, чтобы найти каталог сборки:

Найдя исполняемый файл, вы можете добавить ссылку на Windows.Forms, чтобы сделатьэта работа (по общему признанию, не идеальная):

using System.IO;
using System.Windows.Forms;

string appPath = Path.GetDirectoryName(Application.ExecutablePath);

Использование отражения:

using System.IO;
using System.Reflection;

string path = Path.GetDirectoryName(Assembly.GetAssembly(typeof(MyClass)).CodeBase);

Или

string path = System.Reflection.Assembly.GetExecutingAssembly().Location;

Вероятно, вы можете просто кэшировать этот путь загрузки своего приложениякак это не изменится.

2 голосов
/ 24 сентября 2013

Существует разница между местоположением сборки и рабочим каталогом приложения.Иногда они могут быть одинаковыми, но это не должно быть так.Чтобы изменить рабочий каталог, вы можете запустить приложение из cmd.exe или просто создать ярлык с другим каталогом в свойстве Start in.

Рабочий каталог приложения можно получить следующим образом:

System.IO.Path.GetFullPath(".")

Примечание: Каталог . всегда является текущим рабочим каталогом, мы просто получаем абсолютный путь к нему.Иногда вам может не понадобиться абсолютный путь.Например, если вы хотите прочитать файл в рабочем каталоге:

new StreamReader("./file-in-the-working-directory.txt");

или даже:

new StreamReader("file-in-the-working-directory.txt");
1 голос
/ 11 августа 2011

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

Directory.SetCurrentDirectory(GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));

Это приведет вас в порядок.

0 голосов
/ 23 июля 2014
Path.GetDirectoryName(Application.ResourceAssembly.Location)
0 голосов
/ 28 октября 2011

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

var filepath = System.Reflection.Assembly.GetExecutingAssembly().Location;
var rootindex = filepath.IndexOf("TestProject\\");
var wordlength = "TestProject".Count();
var rootpath = filepath.Remove(rootindex + wordlength);
sDir = filepath.Remove(rootindex + wordlength);
//sDir = "c:\\dev\\Test_Solution\\TestProject";

Я знаю, что это базовые вещи, но я не работал несколько месяцев, а иногда и приятнонемного помочь с очевидными вещами.

0 голосов
/ 18 июня 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...