在C#控制台应用程序中考虑以下语句:
Process.Start("3rdParty/SomeTool.exe");
此语句在SomeTool.exe
文件夹中的3rdParty
相对于...究竟是什么?应用程序的.exe所在的文件夹?当前工作目录(可以在应用程序的生命周期内更改)?还有别的吗?
答案 0 :(得分:6)
它与您的流程的当前工作目录相关。
您可以使用Directory.GetCurrentDirectory()
确定当前的工作目录,并使用Directory.SetCurrentDirectory()
进行更改。
答案 1 :(得分:1)
那么,为什么我们不知道呢?
让我们创建一个简单的控制台应用程序并享受它的乐趣:
namespace ConsoleApplication1
{
class Program
{
public static void Main()
{
Directory.CreateDirectory("Test");
Console.WriteLine($"Absolute path is: { Path.GetFullPath("Test")}");
Console.ReadLine();
}
}
}
在发布模式下构建它(我们毕竟正在部署它)并将它放在一些可访问的位置。现在双击它,看看你得到了什么输出。
绝对路径是:{SomeAccesibleLocationPath} \ Test
嗯,看起来相对路径是相对于启动可执行文件的目录。这总是如此吗?
让我们构建另一个应用,我们将其称为ConsoleApplication2,并播放更多内容:
class Program
{
public static void Main()
{
Console.WriteLine($"TEST #1: {LaunchProcessAndGetAbsolutePath()}");
Console.WriteLine($"TEST #2: {LaunchProcessAndGetAbsolutePath(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))}");
Console.ReadLine();
}
private static string LaunchProcessAndGetAbsolutePath(string workingDirectory = null)
{
var startInfo = new ProcessStartInfo(@"{SomeAccesibleLocationPath}\ConsoleApplication1.exe");
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
if (workingDirectory != null)
{
startInfo.WorkingDirectory = workingDirectory;
}
using (var p = Process.Start(startInfo))
{
var ret = p.StandardOutput.ReadLine();
p.StandardInput.WriteLine();
p.WaitForExit();
return ret;
}
}
}
如果我们运行此操作,您将看到输出如下:
TEST#1:{MyConsoleApplication2ExecutableDirectory} \ Test
TEST#2:{MyDocumentsPath} \ Test
需要考虑的重要事实:
答案 2 :(得分:1)
如上所述,它与当前工作目录相关。该值可以通过Directory.SetCurrentDirectory()
更改和确定。 Directory.GetCurrentDirectory()
一些说明:
当前工作目录 CAN 是可执行文件所在的文件夹;如果未指定,则这是默认工作目录。 但也可以在启动进程或运行时将其设置为其他文件夹。在开始时,通过在启动进程时设置属性ProcessStartInfo.WorkingDirectory
,或者也可以通过使用例如符号链接对话框中的工作目录字段来启动。开始菜单。后者可以由用户完成。当前工作目录 CAN 也可以被加载到进程中的任何第三方库更改。
因此,应用程序中未检查工作目录的相对路径不可靠,通常会导致意外行为。