【C#】学习获取程序执行路径,Gemini 帮助分析

一、前言:

        在Delphi中,如果想要获取当前执行程序的目录,程序代码如下:

ExtractFilePath(ParamStr(0));

        今天在分析一个别人做的C#程序时看到了一段C#代码,意思是获取执行程序所在的文件目录:

public static string GetAssemblyDirectory()
{var codeBaseUrl = Assembly.GetExecutingAssembly().CodeBase;var filePathToCodeBase = new Uri(codeBaseUrl).LocalPath;var directoryPath = Path.GetDirectoryName(filePathToCodeBase);return directoryPath;
}

通过 Gemini 分析的结果如下:

解释:

1. 函数定义:
  • public: 该关键字使同一程序集(项目)中的任何其他代码都能访问该函数。
  • static:静态: 该关键字表示该函数是静态方法,这意味着调用该函数时无需创建包含该函数的类的实例。
  • string:字符串: 指定函数的返回类型,本例中为字符串。
  • GetAssemblyDirectory(): 这是函数本身的名称。
2. 获取程序的代码集:
  • Assembly.GetExecutingAssembly(): 此行将检索当前正在执行代码的程序集的相关信息。
  • CodeBase: 程序集对象的这一属性可获取主程序集文件(通常是 .exe 文件)的位置。返回值是一个类似 URL 的字符串。
3. 将代码库转换为本地路径:
  • new Uri(codeBaseUrl): 这一行根据 codeBaseUrl 字符串创建 Uri 对象。Uri 对象可以表示不同类型的地址,包括 URL 和文件路径。
  • LocalPath: Uri 对象的这一属性可从类似 URL 的字符串中提取本地文件路径部分。
4. 提取目录路径:
  • Path.GetDirectoryName(filePathToCodeBase): 该行使用了 System.IO 命名空间中的 Path.GetDirectoryName 静态方法。它将 filePathToCodeBase 字符串作为输入,并返回该路径所代表文件的目录路径。
5. 返回目录路径:
  • return directoryPath: 这一行返回函数结果中提取的目录路径(directoryPath)。
6. 总结:

        GetAssemblyDirectory() 函数用于检索当前执行的程序集(.exe 文件)所在的目录。这是访问与主程序存储在同一目录下的资源或配置文件的有用方法
 

附加说明:

        当程序从临时位置或网络驱动器执行时,该功能尤其有用。检索到的目录路径可用于查找与程序相关的其他文件,如配置文件、数据文件或库。

二、在 C# 中,有几种方法可以获取当前执行程序的目录: 

1. 使用 System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName 属性:

        此属性获取当前进程的主模块的完整路径,包括文件名。主模块通常是程序的执行文件。

string path = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
Console.WriteLine(path);

2. 使用 System.Environment.CurrentDirectory 属性:

        此属性获取当前进程的当前工作目录。工作目录是程序可以访问和写入文件的目录。

string path = System.Environment.CurrentDirectory;
Console.WriteLine(path);

3. 使用 System.IO.Directory.GetCurrentDirectory() 方法:

        此方法获取当前应用程序的当前工作目录。与 System.Environment.CurrentDirectory 属性类似,但仅适用于 .NET Framework 4.0 及更高版本。

string path = System.IO.Directory.GetCurrentDirectory();
Console.WriteLine(path);

4. 使用 System.AppDomain.CurrentDomain.BaseDirectory 属性:

        此属性获取当前应用程序的基目录。基目录是应用程序的根目录,通常包含程序的执行文件和其他必需的文件。

string path = System.AppDomain.CurrentDomain.BaseDirectory;
Console.WriteLine(path);

5. 使用 System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase 属性:

        此属性获取启动应用程序的可执行文件的路径,不包括可执行文件的名称。

string path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
Console.WriteLine(path);

6. 使用 System.Windows.Forms.Application.StartupPath 属性:

        此属性获取启动应用程序的可执行文件的路径,不包括可执行文件的名称。仅适用于 Windows Forms 应用程序。

string path = System.Windows.Forms.Application.StartupPath;
Console.WriteLine(path);

7. 使用 System.Windows.Forms.Application.ExecutablePath 属性:

        此属性获取启动应用程序的可执行文件的路径,包括可执行文件的名称。仅适用于 Windows Forms 应用程序。

string path = System.Windows.Forms.Application.ExecutablePath;
Console.WriteLine(path);

注意:

  • 使用 System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName 属性时,请注意,如果程序是从网络下载或临时目录运行的,则返回的路径可能不准确。
  • 使用 System.Environment.CurrentDirectory 属性和 System.IO.Directory.GetCurrentDirectory() 方法时,请注意,工作目录可能会被程序更改。
  • 使用 System.AppDomain.CurrentDomain.BaseDirectory 属性时,请注意,基目录可能包含其他程序的文件。
  • 使用 System.Windows.Forms.Application.StartupPath 属性和 System.Windows.Forms.Application.ExecutablePath 属性时,请注意,这些属性仅适用于 Windows Forms 应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/12590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于区块链的Web 3.0关键技术研讨会顺利召开

基于区块链的Web3.0关键技术研讨会 2024年4月23日,由国家区块链技术创新中心主办的“基于区块链的web3.0关键技术研讨会”召开。Web3.0被用来描述一个运行在“区块链”技术之上的“去中心化”的互联网,该网络上的主体掌握自己数据所有权和使用权&#xf…

【回眸】git VS repo 区别

git VS repo 区别 1. git:Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。 2. Repo: Repo是谷歌用Python脚本写的调用git的一个脚本,Repo实现管理多个git库。 Git 常用命令 1. git init:在当前目…

【原创】java+springboot+mysql企业邮件管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…

Vue的学习 —— <vue组件>

目录 前言 正文 一、选项式API与组合式API 二、生命周期函数 1、onBeforeMount() 2、onMounted() 3、onBeforeUpdate() 4、onUpdated() 5、onBeforeUnmount() 6、onUnmounted() 三、组件之间的样式冲突 四、父组件向子组件传递数据 1、定义props 2、静态绑定props…

C++青少年简明教程:赋值语句

C青少年简明教程:赋值语句 赋值语句是编程中最基本也是最常用的概念之一,它用于将一个值分配给一个变量。 使用等号( 称为赋值运算符)来给变量赋值,赋值语句的左边是要赋值的变量,右边是要赋给变量的值。C…

Docker 使用 CentOS 镜像

使用 docker run 直接运行 CentOS 7 镜像,并登录 bash。 C:\Users\yhu>docker run -it centos:centos7 bash Unable to find image centos:centos7 locally centos7: Pulling from library/centos 2d473b07cdd5: Pull complete Digest: sha256:be65f488b7764ad36…

GPT-4o:全面深入了解 OpenAI 的 GPT-4o

GPT-4o:全面深入了解 OpenAI 的 GPT-4o 关于 GPT-4o 的所有信息ChatGPT 增强的用户体验改进的多语言和音频功能GPT-4o 优于 Whisper-v3M3Exam 基准测试中的表现 GPT-4o 的起源追踪语言模型的演变GPT 谱系:人工智能语言的开拓者多模式飞跃:超越…

连接虚拟机的 redis

用Windows 的 Redis Insight 连接虚拟机的 安装redis发现连不上 我的redis是新安装,没有用户名密码,发现是ip问题 127 开头的被我注释了,换成了ifconfig查到的ip

vim命令大全(基础版)

创建一个py文件 vim cs.py一、命令模式 按Esc后,按shift:进入命令模式 :wq # 保存并退出 :q # 退出 :q! # 强制退出 :%d # 删除全部内容按两下d,删除光标所在行 按两下y,复制光标所在行 按一下p,粘贴复制内容到下…

Android性能:SurfaceFlinger与BufferQueue(3)

Android性能:SurfaceFlinger与BufferQueue(3) Android显示系统的组成可以概括为两大部分:绘制(DrawFrame)合成(SurfaceFlinger HWC) 绘制:Surface中空的 GraphicBuffer->CPU或者GPU通过Canv…

Python GUI开发- Qt Designer环境搭建

前言 Qt Designer是PyQt5 程序UI界面的实现工具,使用 Qt Designer 可以拖拽、点击完成GUI界面设计,并且设计完成的 .ui 程序可以转换成 .py 文件供 python 程序调用 环境准备 使用pip安装 pip install pyqt5-toolsQt Designer 环境搭建 在pip安装包…

Vue 常见通信

Vue 常见通信 1、父子通信 父传子 props,子传父 events($emit); 通过父链 / 子链 通信$parent / $children; $refs获取ref 可以访问组件实例方法,; 提供与注射provide / inject a t t r s …

使用Processing和PixelFlow库创建交互式流体太极动画

使用Processing和PixelFlow库创建交互式流体太极动画 引言准备工作效果展示代码结构代码解析第一部分:导入库和设置基本参数第二部分:流体类定义MyFluidDataConfig 类详解MyFluidData 类详解my_update 方法详解流体类定义完整代码 第三部分:太…

找数字-算法

解法一、数位模拟 比n大的最小数就是n1,当n1时,以下几种情况会导致n中1的个数发生变化(或者不变) 1.n的低位连续1的个数count>1,如1011,10111,1111等,加1后使得n中1的个数减少count-1个 解…

基于SVPWM的飞轮控制系统的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM的飞轮控制系统的simulink建模与仿真。SVPWM的核心思想是将逆变器输出的三相电压矢量在两相静止坐标系(αβ坐标系)中表示,通过控…

Python3 数据类型详解:掌握数据基石,编写高效程序

Python3 中的基本数据类型包括整数(int)、浮点数(float)、布尔值(bool)、字符串(str)、列表(list)、元组(tuple)、集合(se…

JAVA static注入 Util使用之Service注入

一般在Util等静态方法中调用Service或mapper,初始化后会出现空指针异常:java.lang.NullPointerException。 代码执行优先级的问题,在一个Java类中,存在着静态代码块,静态方法,构造函数,成员方法等等。不同…

golang中的类和接口

类 在 Go 语言中并没有类的概念,而是使用结构体来实现面向对象的特性。通过 type 关键字可以定义自定义类型,包括结构体类型。下面是一个简单的示例: package mainimport "fmt"// 定义一个结构体类型 type Person struct {Name s…

只对外公开必要的信息和步骤

隐藏内部结构 使对象的内部结构对外部不可见的内容的处理被称为封装化。只公开方法等使用者所需要的最低限度的接口,使用者只能通过外部接口进行访问。如此一来,使用该类的程序就无须知道其内部的具体实现。 通过封装化,不仅可以防止调用者…

Node.js安装及环境配置(超详细!保姆级!!)

目录 一、进入官网地址下载安装包 二、安装程序 三、环境配置 四、测试 五、安装淘宝镜像 一、进入官网地址下载安装包 Node.js — Download Node.js (nodejs.org) 选择对应你系统的 node.js 版本,我选择的是Windows系统,64位 点击图中选项&#…