WPF下获取文件运行路径、运行文件名等
在客户端开发过程中,经常需要获取相对路径的一些资源,而相对路径的就与客户端运行文件的路径息息相关了。在以前的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下获取文件运行路径、运行文件名等的更多相关文章
- Delphi获取文件名、文件名不带扩展名、文件名的方法;delphi 获取文件所在路径
取文件名 ExtractFileName(FileName); 取文件扩展名: ExtractFileExt(filename); 取文件名,不带扩展名: 方法一: Function Extrac ...
- 【转】C#路径中获取文件全路径、目录、扩展名、文件名称
C#路径中获取文件全路径.目录.扩展名.文件名称 原文链接:https://www.cnblogs.com/JiYF/p/6879139.html 常用函数 需要引用System.IO 直接可以调 ...
- C#路径中获取文件全路径、目录、扩展名、文件名称
C#路径中获取文件全路径.目录.扩展名.文件名称常用函数 需要引用System.IO 直接可以调用Path的静态方法 class Program { static void Main(string[] ...
- [转载]《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化
Delphi 版 everything.光速搜索代码>,文章中关于获取文件全路径的函数:GetFullFileName,有一个地方值得优化. 就是有多个文件,它们可能属于同一个目录. 譬如 Sy ...
- 一个获取文件绝对路径的sh
脚本里有个获取文件绝对路径的需求,linux里有个很方便的realpath命令,但是mac下没有,甚至readlink -f也跟linux下的表现不同,所以……直接用pwd算了 #!/bin/bash ...
- java获取文件的路径问题
java获取文件的路径问题 在java中读取读取文件,经常因为路径的问题找不到,此文用于记录如何定位文件的简单方法. 本基于springboot做的测试,主要是构建工程方便,所用的方法都是JDK中的方 ...
- HDFS 读取、写入、遍历文件夹获取文件全路径、append
版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/37573081 1.从HDFS中 ...
- QT 获取文件的路径、打开文件的弹出对话框
1.打开获取文件夹路径的对话框 QString filePath = QFileDialog::getExistingDirectory(this, "请选择文件保存路径...", ...
- linux C++ 获取文件绝对路径
提供ftp服务时需要获取文件绝对路径,这里记录一下. #include <stdlib.h> #include <stdio.h> #include <limits.h& ...
随机推荐
- WPF之花式控件功能扩展
文章默认你已经入门WPF了 WPF日常开发,经常遇到默认的控件功能不满足需求,怎么办? No1. 自定义控件模板 平时开发中,经常遇到比较"俗"的需求,嫌弃控件默认的样子. ...
- 为LInux系统安装坚果云网盘
首先 从www.jianguoyun.com/s/downloads/linux 中下载安装包(deb.rpm) deb 包安装及解决依赖方法 1. 使用 gdebi 安装,自动安装依赖 sudo g ...
- ArchLinux安装步骤(一)
本文为安装archlinux的教程,需要有硬盘分区,挂载等基础linux命令的了解还有vim的基本操作,不知道也没关系,这里有大神的视频教程ArchLinux指南. 确实是不是uefi模式 ls /s ...
- nmcli device and nmcli connection
NetworkManager是RHEL 7之后推出的有效管理网络的服务 NetworkManager通过工具nmcli来管理网卡 网卡属于物理硬件,NetworkManager属于软件层面,如何通过软 ...
- C语言:char总结
char字符型数据1.用单引号限制的1字节的字符称为字符型数据,字符型常量2.字符型常量实质保存的是对应字符的ASCII码值,是一个整数3.字符型常量表示范围:0-2554.声明字符型变量 char ...
- c++中的基本IO
引言 c++不直接处理输入和输出,而是通过标准库中的类型处理IO.IO的设备可以是文件.控制台.string.c++主要定义了三种IO类型,分别被包含在iostream.fstream.sstream ...
- 【学习笔记】Github的使用
在github上上传项目代码 在github官网上新建自己的仓库,需要写好标题和说明文件,然后复制自己的仓库地址 在要上传到的本地project中右键, Git bash here,接着输入 git ...
- POJ1934 Trip 题解
LCS 模板,但要输出具体方案,这就很毒瘤了. 神奇的预处理:fa[i][j]表示在 \(a\) 串的前 \(i\) 个字符中,字母表第 \(j\) 个字母最晚出现的位置,fb[i][j]同理. 这样 ...
- 7.29考试总结(NOIP模拟27)[牛半仙的妹子图·Tree·序列]
前言 从思路上来讲是比较成功的,从分数上就比较令人失望了. 考场上是想到了前两个题的正解思路,其实最后一个题是半个原题,只可惜是我看不懂题... 这波呀,这波又是 语文素养限制OI水平.. 改题的时候 ...
- jvm源码解读--01 jvm加载java/lang/object过程
现在做一下记录,这个看了两天,看的过程发现了很多c++的高级特性,没接触过,还得慢慢撸,禁止很慢 那么现在开始 吧 先打两个断点 java.c:351 JavaMain(void * _args) { ...