将进程的工作目录设置为exe文件的路径?

3
我有一个程序,可以监视进程并在它们关闭或失败时重新启动它们。这最初是一个工作项目,但我把它带回家来在我的家庭服务器上保持游戏服务器的运行,例如Minecraft、Terraria和最近的Cube World。该程序是独立的,位于我的桌面上。当它启动Cube World的Server.exe时,exe通常会在Cube World文件夹中创建的所有文件都会被创建在桌面上。我猜测我的程序有一个工作目录在桌面上,因此它启动的任何子进程(如Server.exe)都将具有相同的工作目录。这个问题不仅仅局限于家里的Cube World服务器。这个程序还在工作中与重要的后端进程保持连接。
如果我使用C#中的ProcessStartInfo启动进程,如何确保启动的进程的工作目录是exe所在的目录?该进程可能使用相对路径名启动,也可能在系统PATH中,这使得问题变得更加困难。
1个回答

3

使用ProcessStartInfo.WorkingDirectory检查Windows路径中是否存在可执行文件相结合,确定可执行文件的路径。

您可能需要先检查相对路径,这也应该处理绝对路径(我尚未测试以下代码,但我认为它看起来不错):

string myAppPath = System.Reflection.Assembly.GetEntryAssembly().Location;
if (File.Exists(Path.Combine(myAppPath, pathToExe)))
{
    workDir = Path.GetDirectoryName(Path.Combine(myAppPath, pathToExe));
}
else 
{
    // Use the referenced article to iterate thru System PATH to find the right path
}

根据您的编辑,我宁愿使用Path.GetFullPath(pathToExe)而不是附加自己应用程序的路径。但我知道您的意思,可能会尝试一下。在更改代码并获得真正模糊的错误之前,我想要确保。 - Corey Ogburn
@CoreyOgburn:是的,我认为那样做没问题 - 我忘记了那个函数(它正是我试图从Path.Combine中得到的结果)。 - Michael Bray
我只是想避免一个情况,即我的程序在路径上时,工作目录不是我的应用程序路径或某些其他奇怪的情况,这种情况下我的程序发现了一条路径,但当我启动进程时,它从另一个路径运行。那会比现在更糟糕。 - Corey Ogburn
@CoreyOgburn:当然可以……但是无论是我的代码还是GetFullPath都不能保证这一点。确保这一点的方法是确定EXE的完整路径(你的方式或者我的方式),然后通过在ProcessStartInfo.FileName中指定完整路径来启动该特定的EXE。设置ProcessStartInfo.WorkingPath是一个好主意,但实际上与启动哪个EXE没有任何关系。 - Michael Bray
对于未来可能遇到此问题的任何人:我还发现有时需要注意PATHEXT才能找到文件。 - Corey Ogburn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接