【问题标题】:Setting a working directory for a process to the exe's path?将进程的工作目录设置为exe的路径?
【发布时间】:2013-07-09 09:53:26
【问题描述】:

我有一个程序可以监视进程并在它们关闭或失败时重新启动它们。它最初是一个工作项目,但我把它带回家以在我的家庭服务器上保持游戏服务器,即 Minecraft、Terraria 和最近的 Cube World。该程序是独立的,位于我的桌面上。当它启动 Cube World 的 Server.exe 时,该 exe 通常会在 Cube World 的文件夹中创建的所有文件都会在桌面上创建。我的猜测是我的程序有一个桌面工作目录,因此它启动的任何子进程(如 Server.exe)都将具有相同的工作目录。问题不仅限于 Cube World 在家中的服务器。该程序与工作中的重要后端进程保持活力。

如果我在 C# 中使用 ProcessStartInfo 启动进程,如何确保启动进程的工作目录是 exe 所在的目录?该进程可能以相对路径名启动,也可能位于系统路径上,这使得这变得更加困难。

【问题讨论】:

    标签: c# working-directory


    【解决方案1】:

    结合使用ProcessStartInfo.WorkingDirectoryCheck if an executable exists in the windows path 来确定可执行文件的路径。

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

    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) 而不是附加我自己的应用程序路径。但我知道你要去哪里,可能会玩一会儿。在我更改代码并得到一个真正晦涩的错误之前,我想确定一下。
    • @CoreyOgburn:是的,我认为这很好 - 我忘记了那个功能(这正是我试图摆脱Path.Combine的结果)
    • 我只是想避免我的程序在路径上而工作目录不是我的应用程序路径的情况或其他一些奇怪的情况,即我的程序找到一个路径并且当我启动进程时,它从另一个跑。那会比现在更糟。
    • @CoreyOgburn:当然可以……但是我的代码和GetFullPath 都不能保证这一点。什么可以保证确定EXE的完整路径(你的方式或我的方式),然后通过在ProcessStartInfo.FileName中指定完整路径来启动该特定的EXE。设置ProcessStartInfo.WorkingPath 是个好主意,但实际上与启动哪个EXE 无关。
    • 对于将来可能会发现此内容的任何人:我还发现有时需要注意 PATHEXT 才能找到文件。
    猜你喜欢
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2019-11-08
    • 2021-10-07
    相关资源
    最近更新 更多