应用程序取得当前目录和退出

如题c#获取当前运行应用程序所在目录和退出

前言

现在这浮躁社会,领导都是拍脑袋,大家都是图个短平快,压力进度给着,迫不得已在这种环境下大家都只能以搬砖的态度对待工作,都是用搜索引擎找 然后到处抄代码对吧。找了一片的方法,有AppDomain.CurrentDomain.BaseDirectory,有返回当前应用程序的根目录System.Reflection.Assembly.GetExecutingAssembly().Location回当前执行的程序集的路径。Application.ExecutablePath Application.StartupPath甚至我还知道其他方式。你还别说,嘿。。。。。抄了一片代码来试试,还都可以运行能够达到效果。

复制代码
1 //通过assembly
2 //得到exe文件完整路径
3 string appPath2 = System.Reflection.Assembly.GetExecutingAssembly().Location;
4 //得到exe文件所在目录
5 string appPath1 = System.AppDomain.CurrentDomain.BaseDirectory;

进程方式访问

复制代码
1 //可取到主窗体标题
2  var mainwindowTitle = Process.GetCurrentProcess().MainWindowTitle;
3 //注意,,这种方式取不到exe文件路径
4 var appPath5 = Process.GetCurrentProcess().StartInfo.FileName;
5 //这种方式可获取当前进程的 exe文件完整路径
6 var appPath6 = Process.GetCurrentProcess().MainModule.FileName;

概念梳理

本身有几个概念请大家认识清楚。我们本身运行的exe那一堆东西 叫应用程序集 也叫Assembly 也叫进程 Process 都是一个意思,东西是一个东西,但是概念上是不同的。还有注意上面的代码获取exe执行程序路径的

复制代码
1 string appPath2 = System.Reflection.Assembly.GetExecutingAssembly().Location;
2 var appPath6 = Process.GetCurrentProcess().MainModule.FileName;

本意概念都是"主运行模块"的文件的路径,因为代码有可能不是直接从你这运行的有可能从其他地方加载的。

  • Assembly从意义上强调被调用的那一坨exe或者dll其内部的功能和方法元数据定义。
  • Process 本质是 当前的if else 判断 改变量 这堆状态机代码 在 哪个进程执行。从意义上强调被操作系统调度的应用程序进程及收操作系统管控的那块内存区域。

我们都称之为运行的"东西",应用程序对象,我们知道vc++里有 application。

复制代码
1 int CMFCh11App::ExitInstance()
2 {
3     //TODO: 处理可能已添加的附加资源
4     AfxOleTerm(FALSE);
5 
6     return CWinApp::ExitInstance();
7 }

这些东西自己称自己为 为"application"于是乎我们在Winform里可以找到有Winform的application。

复制代码
1 //得到exe文件完整路径
2 string appPath3 = System.Windows.Forms.Application.ExecutablePath;
3 //得到exe文件所在目录
4 string appPath4 = System.Windows.Forms.Application.StartupPath;

在wpf里可以找到有wpf的application,注意wpf的application取不到所运行的exe所在目录。

复制代码
1 string appstr = Application.Current.MainWindow.ToString();

回归本质概念

而这个东西本质就应该是天然的 操作系统应该给到应用程序级的信息 ,应用程序应该天然的知道自己从哪里启动的,事情的本质 ,嗯 不错 又回归到事情的本质。我们进行文件接口操作不是 Directory 吗 ,我们写文件时不是./" 目录 就是写到当前应用程序目录吗 ,这个东西不应该本身就是天然的吗。是的。

复制代码
1 DirectoryInfo dir = new DirectoryInfo("./");
2 //输出d:\xxx\
3 Console.WriteLine(dir.FullName);
4 //输出d:\xxx
5 Console.WriteLine(Directory.GetCurrentDirectory());

注意这个结尾,多一个斜杠在Path.Combine( ) 的时候会出幺蛾子。

关于应用程序的退出

应用程序如何退出,想想我们为什么被叫做程序员,不就是编写流水线作业的么。没那么高大上。计算机运转需要连续不断的喂指令。想想在dos时代或者单片机上编程,当没有指令喂的时候可不就自然结束了么,要啥特别操作,你说要啥操作根本不需要。

复制代码
1 class Program
2 {
3     static void Main(string[] args)
4     {
5         Console.WriteLine("aaa");
6         //到此处应用程序就结束了
7     }
8 }

好,你非要钻牛角非要说中途退出,你中途return不就得了,或者可以

复制代码
1 Environment.Exit(0);

所以说dos程序根本没有"不知道自己何时退出"这个概念哈,只有图形化界面才"不知道自己何时退出"因为窗体自己本身在一个死循环周期里通过Windows消息机制在维持。

winform退出

复制代码
1 System.Windows.Forms.Application.Exit();

wpf退出

复制代码
1 System.Windows.Application.Current.Shutdown(0);

由于最开始的时候只有winform支持后来又添加了wpf,可以在命名空间上看得出来在整个.NetFramework实际功能和概念上有很多重叠的地方。