【问题标题】:WPF Working DirectoryWPF 工作目录
【发布时间】:2010-06-18 12:46:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf


    【解决方案1】:

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

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

    您可能只缓存应用的加载路径,因为它不会改变。

    【讨论】:

    • Application.ExecutablePath 在 WPF 中不存在,所以我使用了反射。这适用于 PDF 文件和图像文件,我使用的是包 URI。似乎有一些更好的方法来处理这个场景。
    • 正如this link 所说,System.Reflection.Assembly.GetExecutingAssembly().Location 可能会在shadow-copying 之后获得位置。
    【解决方案2】:

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

    你可以像这样获取Application的工作目录:

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

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

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

    甚至:

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

    【讨论】:

    • 为什么所有其他答案都受到青睐?这是唯一正确的一个。所有其他人都给出了可执行文件的位置而不是工作目录。
    【解决方案3】:

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

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

    这会让你变得坦率。

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:
        Path.GetDirectoryName(Application.ResourceAssembly.Location)
        

        【讨论】:

          【解决方案6】:

          以防万一您需要绞尽脑汁才能找到一条路径,我将把我的例子留给您。我使用项目名称来追踪如何拆分完整路径字符串。我什至会留下原话,所以你也许可以理解思考过程。

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

          我知道这是基本的东西,但我已经失业几个月了,有时在显而易见的东西上能得到一点帮助真是太好了。

          【讨论】:

            猜你喜欢
            • 2011-11-03
            • 2012-02-01
            • 1970-01-01
            • 2012-11-21
            • 2015-10-03
            • 2014-12-08
            • 1970-01-01
            • 2012-07-22
            • 2016-10-12
            相关资源
            最近更新 更多