應(yīng)用程序取得當(dāng)前目錄和退出
如題c#獲取當(dāng)前運(yùn)行應(yīng)用程序所在目錄和退出
前言
現(xiàn)在這浮躁社會(huì),領(lǐng)導(dǎo)都是拍腦袋,大家都是圖個(gè)短平快,壓力進(jìn)度給著,迫不得已在這種環(huán)境下大家都只能以搬磚的態(tài)度對(duì)待工作,都是用搜索引擎找 然后到處抄代碼對(duì)吧。找了一片的方法,有AppDomain.CurrentDomain.BaseDirectory,有返回當(dāng)前應(yīng)用程序的根目錄System.Reflection.Assembly.GetExecutingAssembly().Location回當(dāng)前執(zhí)行的程序集的路徑。Application.ExecutablePath Application.StartupPath甚至我還知道其他方式。你還別說,嘿。。。。。抄了一片代碼來試試,還都可以運(yùn)行能夠達(dá)到效果。
1 //通過assembly 2 //得到exe文件完整路徑 3 string appPath2 = System.Reflection.Assembly.GetExecutingAssembly().Location; 4 //得到exe文件所在目錄 5 string appPath1 = System.AppDomain.CurrentDomain.BaseDirectory;
進(jìn)程方式訪問
1 //可取到主窗體標(biāo)題 2 var mainwindowTitle = Process.GetCurrentProcess().MainWindowTitle; 3 //注意,,這種方式取不到exe文件路徑 4 var appPath5 = Process.GetCurrentProcess().StartInfo.FileName; 5 //這種方式可獲取當(dāng)前進(jìn)程的 exe文件完整路徑 6 var appPath6 = Process.GetCurrentProcess().MainModule.FileName;
概念梳理
本身有幾個(gè)概念請(qǐng)大家認(rèn)識(shí)清楚。我們本身運(yùn)行的exe那一堆東西 叫應(yīng)用程序集 也叫Assembly 也叫進(jìn)程 Process 都是一個(gè)意思,東西是一個(gè)東西,但是概念上是不同的。還有注意上面的代碼獲取exe執(zhí)行程序路徑的
1 string appPath2 = System.Reflection.Assembly.GetExecutingAssembly().Location; 2 var appPath6 = Process.GetCurrentProcess().MainModule.FileName;
本意概念都是“主運(yùn)行模塊”的文件的路徑,因?yàn)榇a有可能不是直接從你這運(yùn)行的有可能從其他地方加載的。
- Assembly從意義上強(qiáng)調(diào)被調(diào)用的那一坨exe或者dll其內(nèi)部的功能和方法元數(shù)據(jù)定義。
- Process 本質(zhì)是 當(dāng)前的if else 判斷 改變量 這堆狀態(tài)機(jī)代碼 在 哪個(gè)進(jìn)程執(zhí)行。從意義上強(qiáng)調(diào)被操作系統(tǒng)調(diào)度的應(yīng)用程序進(jìn)程及收操作系統(tǒng)管控的那塊內(nèi)存區(qū)域。
我們都稱之為運(yùn)行的"東西",應(yīng)用程序?qū)ο?,我們知道vc++里有 application。
1 int CMFCh11App::ExitInstance() 2 { 3 //TODO: 處理可能已添加的附加資源 4 AfxOleTerm(FALSE); 5 6 return CWinApp::ExitInstance(); 7 }
這些東西自己稱自己為 為"application"于是乎我們?cè)赪inform里可以找到有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取不到所運(yùn)行的exe所在目錄。
1 string appstr = Application.Current.MainWindow.ToString();
回歸本質(zhì)概念
而這個(gè)東西本質(zhì)就應(yīng)該是天然的 操作系統(tǒng)應(yīng)該給到應(yīng)用程序級(jí)的信息 ,應(yīng)用程序應(yīng)該天然的知道自己從哪里啟動(dòng)的,事情的本質(zhì) ,嗯 不錯(cuò) 又回歸到事情的本質(zhì)。我們進(jìn)行文件接口操作不是 Directory 嗎 ,我們寫文件時(shí)不是./" 目錄 就是寫到當(dāng)前應(yīng)用程序目錄嗎 ,這個(gè)東西不應(yīng)該本身就是天然的嗎。是的。
1 DirectoryInfo dir = new DirectoryInfo("./"); 2 //輸出d:\xxx\ 3 Console.WriteLine(dir.FullName); 4 //輸出d:\xxx 5 Console.WriteLine(Directory.GetCurrentDirectory());
注意這個(gè)結(jié)尾,多一個(gè)斜杠在Path.Combine( ) 的時(shí)候會(huì)出幺蛾子。
關(guān)于應(yīng)用程序的退出
應(yīng)用程序如何退出,想想我們?yōu)槭裁幢唤凶龀绦騿T,不就是編寫流水線作業(yè)的么。沒那么高大上。計(jì)算機(jī)運(yùn)轉(zhuǎn)需要連續(xù)不斷的喂指令。想想在dos時(shí)代或者單片機(jī)上編程,當(dāng)沒有指令喂的時(shí)候可不就自然結(jié)束了么,要啥特別操作,你說要啥操作根本不需要。
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Console.WriteLine("aaa"); 6 //到此處應(yīng)用程序就結(jié)束了 7 } 8 }
好,你非要鉆牛角非要說中途退出,你中途return不就得了,或者可以
1 Environment.Exit(0);
所以說dos程序根本沒有“不知道自己何時(shí)退出”這個(gè)概念哈,只有圖形化界面才“不知道自己何時(shí)退出”因?yàn)榇绑w自己本身在一個(gè)死循環(huán)周期里通過Windows消息機(jī)制在維持。
winform退出
1 System.Windows.Forms.Application.Exit();
wpf退出
1 System.Windows.Application.Current.Shutdown(0);
由于最開始的時(shí)候只有winform支持后來又添加了wpf,可以在命名空間上看得出來在整個(gè).NetFramework實(shí)際功能和概念上有很多重疊的地方。

浙公網(wǎng)安備 33010602011771號(hào)