WPF工作目录

时间:2010-06-18 12:46:12

标签: wpf

我有一个WPF应用程序,它通过Windows Installer安装在客户端计算机上。此应用程序还注册了文件扩展名(.xyz),因此当用户双击文件时,它会打开我的WPF应用程序并显示该文件(如Microsoft Word)。该程序还有大量文件没有标记为它使用的资源或内容文件(用户手册,零件图纸等)。

当用户双击.xyz文件并打开WPF应用程序时,问题就出现了。该应用程序现在具有.xyz文件所在目录的工作目录。现在程序找不到它需要的任何文件(用户手册,零件图等)。

处理此类问题的最佳方法是什么?我可以设置工作目录(Environment.CurrentDirectory),但是当用户保存或打开.xyz文件时,我的打开文件对话框会更改工作目录。我可以使用包uri作为零件图,但我使用Process.Start作为用户手册,因为它们是PDF。我试着搜索,但无法提出任何问题。

6 个答案:

答案 0 :(得分:5)

您应该能够通过查找可执行文件的目录或使用反射来查找程序集的目录来访问您的安装目录:

通过查找可执行文件,您可以添加对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;

您可以只缓存应用程序的路径上载,因为它不会更改。

答案 1 :(得分:2)

程序集的位置与应用程序的工作目录之间存在差异。有时这些可能是相同的,但事实并非如此。要更改工作目录,您可以从cmd.exe执行应用程序,或者只在Start in属性中创建一个包含不同目录的快捷方式。

您可以像这样获取应用程序的工作目录:

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

注意: . - 目录始终是当前正在运行的目录,我们只是获取它的绝对路径。有时您可能不需要绝对路径。例如,如果要读取工作目录中的文件:

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

甚至:

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

答案 2 :(得分:1)

您可能想要做的另一件事就是在启动时重置当前的工作目录。

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

那会让你平稳起来。

答案 3 :(得分:0)

答案 4 :(得分:0)

Path.GetDirectoryName(Application.ResourceAssembly.Location)

答案 5 :(得分:-1)

万一你需要将自己的大脑包裹起来才能获得一条路径,我会留下你的榜样。我使用项目名称来跟踪如何拆分完整路径字符串。我甚至会离开原来的路线,所以你可以理解思考过程。

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";

我知道这是基本的东西,但是我已经离开工作了几个月,有时候对这些显而易见的东西有点帮助很好。