在客户端开发过程中,经常需要获取相对路径的一些资源,而相对路径的就与客户端运行文件的路径息息相关了。在以前的winform开发中,我们可以使用 System.Windows.Forms.Application 下的方法

来快速的获取,但是在 WPF 如果要使用该类,需要额外进行库的引用,是相当不方便的。

所以,我亲自编写代码验证常用获取运行路径方法,方便日后使用。

核心代码如下:

    private void Button_Click(object sender, RoutedEventArgs e)
{
List<string> logs = new List<string>(); logs.Add("完全路径");
var dd = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName; //exe
logs.Add("System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName " + dd);
var ee = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase; //dll fullpath
logs.Add("System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase " + ee); logs.Add("");
logs.Add("上层文件夹路径");
var aa = System.IO.Directory.GetCurrentDirectory(); //当前可执行路径
logs.Add(" System.IO.Directory.GetCurrentDirectory() " + aa);
var bb = System.Environment.CurrentDirectory; //当前可执行路径
logs.Add("System.Environment.CurrentDirectory " + bb);
var cc = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
logs.Add("System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase "+ cc);
logs.Add(""); logs.Add("文件名");
var ff = System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName;//exe name without extensionName
logs.Add("System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName "+ff);
var gg = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name; // dll name without ExtensionName
logs.Add("System.Reflection.Assembly.GetExecutingAssembly().GetName().Name "+gg);
var hh = System.AppDomain.CurrentDomain.FriendlyName; // dll name without ExtensionName
logs.Add("System.AppDomain.CurrentDomain.FriendlyName "+hh); File.WriteAllLines("Local.txt", logs);
} private void Button2_Click(object sender, RoutedEventArgs e)
{
ClassLibrary1.Class1.Test();
}

其中    ClassLibrary1.Class1.Test();  是额外引用,Test() 的实现和 Button_Click 一致。

整个项目构造如下:

运行程序后,得到下面输出:

Button1执行后打印的路径如下(内部)
完全路径
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName D:\net6.0-windows\WpfApp1.exe 上层文件夹路径
System.IO.Directory.GetCurrentDirectory() D:\net6.0-windows
System.Environment.CurrentDirectory D:\net6.0-windows
System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase D:\net6.0-windows\ 文件名
System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName WpfApp1.exe
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name WpfApp1
System.AppDomain.CurrentDomain.FriendlyName WpfApp1
Button2执行后打印的路径如下(外部dll)
完全路径
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName D:\net6.0-windows\WpfApp1.exe 上层文件夹路径
System.IO.Directory.GetCurrentDirectory() D:\net6.0-windows
System.Environment.CurrentDirectory D:\net6.0-windows
System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase D:\net6.0-windows\ 文件名
System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName WpfApp1.exe
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name ClassLibrary1
System.AppDomain.CurrentDomain.FriendlyName WpfApp1

我们可以发现  System.Reflection.Assembly.GetExecutingAssembly().GetName().Name 是获取的当前运行时的程序集的名称,而非可执行文件的名称。

接下来我将生成的exe 改名,再运行一次。

得到


Button1执行后打印的路径如下(内部)
完全路径
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName D:\net6.0-windows\WpfApp1 - Copy.exe 上层文件夹路径
System.IO.Directory.GetCurrentDirectory() D:\net6.0-windows
System.Environment.CurrentDirectory D:\net6.0-windows
System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase D:\net6.0-windows\ 文件名
System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName WpfApp1 - Copy.exe
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name WpfApp1
System.AppDomain.CurrentDomain.FriendlyName WpfApp1

我们发现 System.AppDomain.CurrentDomain.FriendlyName  获得的文件名没有发生改变(准确的说是获得的WpfApp1.dll的不包含后缀的名称),而

System.Diagnostics.Process.GetCurrentProcess().MainModule 属性获得的文件和路径都与实际文件名一致。

实际开发中,两种方法都会有各自的用途的,如进程处理方面。

根据上面的测试,我做出下表,方便以后使用

方法/属性名 用途 示例
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
  获取运行文件全路径
D:\net6.0-windows\WpfApp1.exe
System.IO.Directory.GetCurrentDirectory()
获取上层文件夹路径

D:\net6.0-windows
System.Environment.CurrentDirectory
获取上层文件夹路径

D:\net6.0-windows
System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
 获取上层文件夹路径

D:\net6.0-windows\

System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName
 获取文件名(带扩展名)

WpfApp1.exe

System.Reflection.Assembly.GetExecutingAssembly().GetName().Name

获取运行时程序集名称

(不带扩展名)

WpfApp1 或 ClassLibrary1(跟随运行时)

System.AppDomain.CurrentDomain.FriendlyName
 获取主程序域名称

WpfApp1

总结,WPF开发中获取相对路径的方法有很多,不管采用哪种方式,都建议要多测试不同情况下是否获得的路径与预期是否一致,如打包,部署等等都可能影响实际路径的改变,还有一些方法未提及,比如

AppDomain.CurrentDomain.BaseDirectory 也可以获得上层文件夹路径,但是某些情况下使用就会有坑(如间接调用),这里就不再赘述了。

WPF下获取文件运行路径、运行文件名等的更多相关文章

  1. Delphi获取文件名、文件名不带扩展名、文件名的方法;delphi 获取文件所在路径

    取文件名 ExtractFileName(FileName); 取文件扩展名: ExtractFileExt(filename); 取文件名,不带扩展名: 方法一:   Function Extrac ...

  2. 【转】C#路径中获取文件全路径、目录、扩展名、文件名称

    C#路径中获取文件全路径.目录.扩展名.文件名称 原文链接:https://www.cnblogs.com/JiYF/p/6879139.html 常用函数 需要引用System.IO   直接可以调 ...

  3. C#路径中获取文件全路径、目录、扩展名、文件名称

    C#路径中获取文件全路径.目录.扩展名.文件名称常用函数 需要引用System.IO 直接可以调用Path的静态方法 class Program { static void Main(string[] ...

  4. [转载]《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化

    Delphi 版 everything.光速搜索代码>,文章中关于获取文件全路径的函数:GetFullFileName,有一个地方值得优化. 就是有多个文件,它们可能属于同一个目录. 譬如 Sy ...

  5. 一个获取文件绝对路径的sh

    脚本里有个获取文件绝对路径的需求,linux里有个很方便的realpath命令,但是mac下没有,甚至readlink -f也跟linux下的表现不同,所以……直接用pwd算了 #!/bin/bash ...

  6. java获取文件的路径问题

    java获取文件的路径问题 在java中读取读取文件,经常因为路径的问题找不到,此文用于记录如何定位文件的简单方法. 本基于springboot做的测试,主要是构建工程方便,所用的方法都是JDK中的方 ...

  7. HDFS 读取、写入、遍历文件夹获取文件全路径、append

    版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/37573081 1.从HDFS中 ...

  8. QT 获取文件的路径、打开文件的弹出对话框

    1.打开获取文件夹路径的对话框 QString filePath = QFileDialog::getExistingDirectory(this, "请选择文件保存路径...", ...

  9. linux C++ 获取文件绝对路径

    提供ftp服务时需要获取文件绝对路径,这里记录一下. #include <stdlib.h> #include <stdio.h> #include <limits.h& ...

随机推荐

  1. 0shell变量

    1.定义变量 2.使用变量 3.修改变量的值 4.将命令的结果赋值给变量 5.只读变量 6.删除变量 一.变量 1.定义变量 在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时 ...

  2. MyEclipse中,编写properties文件,输入中文显示乱码

    我在properties文件中输出中文,结果显示的是乱码,额......好吧,其实不是乱码,哪有这么规范的乱码 其实是在输入中文时发生了转码,就是下面这个样子: 字符集不支持中文,修改方法: 选中你工 ...

  3. QT. 学习之路 二

    Qt 的信号槽机制并不仅仅是使用系统提供的那部分,还会允许我们自己设计自己的信号和槽. 举报纸和订阅者的例子:有一个报纸类 Newspaper,有一个订阅者类 Subscriber.Subscribe ...

  4. Django基础-004 上下文管理器&中间件&前端公共代码复用

    一.上下文管理器 在views中重复使用的代码,可以在上下文管理器中实现 上下文管理器的处理流程如下: 1.先走完views里面的代码,将结果返回给前端 2.然后再将上下文的结果返回给前端 3.上下文 ...

  5. 选择适合入门的自动化测试框架TestNG 基于Java语言的入门选择之一

    对于测试工程师新手来说,最痛苦的莫过于入门,其实只要入门3个月左右,对于自动化测试,所有的测试工程师除了喜爱,就是更爱.自动化测试工作,是从根本上解放人性,不用重复去完成鼠标的点点点,例如以下测试常常 ...

  6. Podistributor播客分发系统介绍

    特性 向用户暴露节目的别名 URL ,在用户访问时重定向至真实的目标资源 URL ,以高效地进行 CDN 切换和便捷地建立失效转移机制. 异步转发请求至统计服务,以解耦用户请求和数据统计,可方便地接入 ...

  7. java课堂考试总结

    9月22日,进行了开学第一堂的java测试,来检验暑假的自学成果.下午的考试中,时间应该是比较充分的,但是我还是有许多功能模块没有完成,功能缺少,在进行测试的时候暴露出了许多漏洞. 总结一下,在暑假的 ...

  8. Requests 方法 -- post请求操作实践

    1.登录Jenkins抓包 ,小编的Jenkins部署在Tomcat上,把Jenkins.war 包放置到webapps目录. 本次用浏览器自带抓包,按下F12操作,主要看post就可以,登录是向服务 ...

  9. 微信小程序云开发-数据库-更新数据

    一.js文件代码使用.update更新数据 写一个更新数据的函数,函数内使用.update更新数据.一定要通过.doc指定修改哪一条数据.  二.wxml文件修改数据的按钮 在wxml文件中写[修改] ...

  10. Java中lombok @Builder注解使用详解(十八)

    Lombok大家都知道,在使用POJO过程中,它给我们带来了很多便利,省下大量写get.set方法.构造器.equal.toString方法的时间.除此之外,通过@Builder注解,lombok还可 ...