什么是相对路径?

时间:2016-12-21 09:44:47

标签: c#

在C#控制台应用程序中考虑以下语句:

Process.Start("3rdParty/SomeTool.exe");

此语句在SomeTool.exe文件夹中的3rdParty相对于...究竟是什么?应用程序的.exe所在的文件夹?当前工作目录(可以在应用程序的生命周期内更改)?还有别的吗?

3 个答案:

答案 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

需要考虑的重要事实:

  1. 相对路径始终相对于工作目录。
  2. 从另一个进程启动进程时,默认工作目录是" parent"的工作目录。进程,它的已启动的"孩子的目录"过程
  3. 通过双击可执行文件启动进程时,工作目录将设置为可执行文件的目录。
  4. 通常,工作目录不必是可执行文件的目录。你的程序的正确性不应该依赖于这种情况。

答案 2 :(得分:1)

如上所述,它与当前工作目录相关。该值可以通过Directory.SetCurrentDirectory()更改和确定。 Directory.GetCurrentDirectory()

一些说明:

当前工作目录 CAN 是可执行文件所在的文件夹;如果未指定,则这是默认工作目录。 也可以在启动进程或运行时将其设置为其他文件夹。在开始时,通过在启动进程时设置属性ProcessStartInfo.WorkingDirectory,或者也可以通过使用例如符号链接对话框中的工作目录字段来启动。开始菜单。后者可以由用户完成。当前工作目录 CAN 也可以被加载到进程中的任何第三方库更改。

因此,应用程序中未检查工作目录的相对路径不可靠,通常会导致意外行为。