在客户端开发过程中,经常需要获取相对路径的一些资源,而相对路径的就与客户端运行文件的路径息息相关了。在以前的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. windows下flutter2.2.3环境搭建

    先上几个必上的网站: 官网: https://flutter.cn/docs/get-started/install/windows 中文资源网(毕竟中文母语,看着轻松): https://flutt ...

  2. "Shortest" pair of paths[题解]

    "Shortest" pair of paths 题目大意 给出 \(n\) 个点,\(m\) 条边,除第一个点和最后一个点外,其他所有的点都只能被经过一次,要求找到两条从第一个点 ...

  3. C语言:读TXT 模拟键盘打字输出

    //#include<ctype.h> #include<stdio.h> #include <windows.h> //#include "string ...

  4. python mysql 图片保存到表,从表中读出图片

    fp = open(aa, 'rb') try: img = fp.read() except: print("图片打开出错") fp.close() return img #上面 ...

  5. c语言数据拼包

    单片机数据拼包 对于数据包拼包方式常规方式有: 数组 指针 结构体 流 下文将此三种方式分别列举此数据包的实现. 然后对比优缺点. 本文举例数据包协议: 包头 长度Length 消息类型 消息序列号S ...

  6. 微信小程序云开发-云函数-数据库和云函数获取数据的区别

    一.数据库获取数据 1.1 数据库获取数据的写法 在本地创建的页面js文件中写代码 1.2 数据库获取数据返回数据限制20条 数据库获取数据,每次返回20条数据(数据库有108条数据) 1.3 数据库 ...

  7. 开发工具IDE从入门到爱不释手(三)运行与调试

    一.启动项目 右键运行 菜单运行 run窗口运行 启动参数 -D可覆盖,application.properties中的配置 如: 自动编译 二.调试项目 断点调试 蓝色背景的行,就是当前程序停住的行 ...

  8. 第二十二篇 -- 事件与信号(自定义label信号的双击功能)

    在第六篇中已经学习过了自定义信号的相关内容了,那一篇中讲的是自定义类中的自定义信号,类和信号都是自己定义的.那么今天想要学习的是事件处理和信号的关系.如同Label标签,它本身有很多的信号,但是它没有 ...

  9. Ubuntu Server连接Wi-Fi

    本文将介绍Ubuntu Server如何通过命令行使用wpa_supplicant连接Wi-Fi 环境 Ubuntu Server 20.04(64位) wpasupplicant 配置 1. 安装 ...

  10. maven之---资源过滤 在java/main/resourse/*.xml ,*.properties引用maven属性${db.username}

    本文主要来源maven实战14.3 为了应对环境的变化,首先使用Maven属性将这个会发生变化的部分提取出来.在上一节的数据库配置中,连接数据库使用的驱动类,URL,用户名和密码都可能发生变化,因此使 ...