如果我使用ShellExecute(或在.net中System.Diagnostics.Process.Start())运行进程,则启动文件名进程不需要是完整路径.
如果我想开始记事本,我可以使用
Process.Start("notepad.exe");
Run Code Online (Sandbox Code Playgroud)
代替
Process.Start(@"c:\windows\system32\notepad.exe");
Run Code Online (Sandbox Code Playgroud)
因为direcotry c:\windows\system32是PATH环境变量的一部分.
如何在不执行进程且不解析PATH变量的情况下检查PATH上是否存在文件?
System.IO.File.Exists("notepad.exe"); // returns false
(new System.IO.FileInfo("notepad.exe")).Exists; // returns false
Run Code Online (Sandbox Code Playgroud)
但我需要这样的东西:
System.IO.File.ExistsOnPath("notepad.exe"); // should return true
Run Code Online (Sandbox Code Playgroud)
和
System.IO.File.GetFullPath("notepad.exe"); // (like unix which cmd) should return
// c:\windows\system32\notepad.exe
Run Code Online (Sandbox Code Playgroud)
是否有预定义的类可以在BCL中执行此任务?
对于我的应用程序,我将一些配置文件与程序集(exe)一起存储在xml中,还有一些其他临时文件用于处理目的.
我".\\"和他发现了一些怪癖Application.StartupPath.
我一直在用
String configPath = ".\\config.xml";
Run Code Online (Sandbox Code Playgroud)
它工作正常,直到我打电话OpenFIleDialog打开其他文件夹中的某些文件,上面的语句失败.显然".\"指的是"CurrentDirectory",每当我们浏览到另一个文件夹时它就会改变.
在某些时候,我正在使用
String configPath = Path.Combine(Application.StartupPath + "config.xml");
Run Code Online (Sandbox Code Playgroud)
在某些时候,当我需要通过使用从另一个文件夹执行此程序集时Process.Start(),事情开始崩溃.显然工作目录设置不正确,Application.StartupPath实际上是指工作目录而不是正在执行程序集的目录,正如我所假设的那样.所以我不得不求助于使用ProcessInfo将工作目录设置到程序集的目录中.当我写VSTO时,我也有这个问题.
所以,我的问题是,什么是获得程序集正在执行的当前目录的最好,最简单和最有保证的方法,没有我刚刚提到的那些怪癖(或误解)?
编辑:我的意思是获取程序集所在的目录
编辑:根据MSDN上AppDomain.BaseDirectory,它似乎可以运行,这是我不想要的东西(我想弄清楚,不是我不想允许更改BaseDirectory,而是,当在改变我检索它而不确定它是否已被更改)
编辑:我注意到一个相关的问题早就发布了.什么会导致正在执行的应用程序的当前目录发生变化?
谢谢你的回答.
在项目设置中,在"调试"选项卡上,有没有办法在命令行参数框中使用项目宏变量?
我知道你不能直接使用它们因为它们没有扩展但是有一个聪明的解决方案吗?
编辑:我正在使用C#项目.