Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Windows应用程序中将相对路径转换为绝对路径?_C# - Fatal编程技术网

C# 如何在Windows应用程序中将相对路径转换为绝对路径?

C# 如何在Windows应用程序中将相对路径转换为绝对路径?,c#,C#,如何在Windows应用程序中将相对路径转换为绝对路径 我知道我们可以在ASP.NET中使用server.MapPath()。但是在Windows应用程序中我们可以做什么呢 我的意思是,如果有一个.NET内置函数可以处理这个问题…您是否尝试过: string absolute = Path.GetFullPath(relative); ??请注意,这将使用进程的当前工作目录,而不是包含可执行文件的目录。如果没有帮助,请澄清您的问题。如果您想获得与.exe相关的路径,请使用 string abs

如何在Windows应用程序中将相对路径转换为绝对路径

我知道我们可以在ASP.NET中使用server.MapPath()。但是在Windows应用程序中我们可以做什么呢

我的意思是,如果有一个.NET内置函数可以处理这个问题…

您是否尝试过:

string absolute = Path.GetFullPath(relative);

??请注意,这将使用进程的当前工作目录,而不是包含可执行文件的目录。如果没有帮助,请澄清您的问题。

如果您想获得与.exe相关的路径,请使用

string absolute = Path.Combine(Application.ExecutablePath, relative);

此选项适用于不同驱动器上的路径、驱动器相对路径和实际相对路径。见鬼,如果
基本路径实际上不是绝对路径,它甚至可以工作;它始终使用当前工作目录作为最终回退

public static String GetAbsolutePath(String path)
{
    return GetAbsolutePath(null, path);
}

public static String GetAbsolutePath(String basePath, String path)
{
    if (path == null)
        return null;
    if (basePath == null)
        basePath = Path.GetFullPath("."); // quick way of getting current working directory
    else
        basePath = GetAbsolutePath(null, basePath); // to be REALLY sure ;)
    String finalPath;
    // specific for windows paths starting on \ - they need the drive added to them.
    // I constructed this piece like this for possible Mono support.
    if (!Path.IsPathRooted(path) || "\\".Equals(Path.GetPathRoot(path)))
    {
        if (path.StartsWith(Path.DirectorySeparatorChar.ToString()))
            finalPath = Path.Combine(Path.GetPathRoot(basePath), path.TrimStart(Path.DirectorySeparatorChar));
        else
            finalPath = Path.Combine(basePath, path);
    }
    else
        finalPath = path;
    // resolves any internal "..\" to get the true full path.
    return Path.GetFullPath(finalPath);
}

这是一个比较老的话题,但可能对某些人有用。 我已经解决了一个类似的问题,但在我的例子中,路径并不在文本的开头

因此,我的解决方案如下:

public static class StringExtension
{
    private const string parentSymbol = "..\\";
    private const string absoluteSymbol = ".\\";
    public static String AbsolutePath(this string relativePath)
    {
        string replacePath = AppDomain.CurrentDomain.BaseDirectory;
        int parentStart = relativePath.IndexOf(parentSymbol);
        int absoluteStart = relativePath.IndexOf(absoluteSymbol);
        if (parentStart >= 0)
        {
            int parentLength = 0;
            while (relativePath.Substring(parentStart + parentLength).Contains(parentSymbol))
            {
                replacePath = new DirectoryInfo(replacePath).Parent.FullName;
                parentLength = parentLength + parentSymbol.Length;
            };
            relativePath = relativePath.Replace(relativePath.Substring(parentStart, parentLength), string.Format("{0}\\", replacePath));
        }
        else if (absoluteStart >= 0)
        {
            relativePath = relativePath.Replace(".\\", replacePath);
        }
        return relativePath;
    }
}
例如:

Data Source=.\Data\Data.sdf;Persist Security Info=False;
Data Source=..\..\bin\Debug\Data\Data.sdf;Persist Security Info=False;


这不取决于你从哪里启动应用程序,也不取决于exe所在的位置吗?诚然,这个问题并不是很清楚。正如你所说,这个问题并不清楚。GetFullPath将从当前工作目录解析。我将编辑我的响应以表明这一点。如果应用程序是通过Windows资源管理器启动的,则当前目录和正在执行的程序集目录似乎是相同的(至少在采取措施使它们不同之前是相同的)。即使您使用指向可执行文件的快捷方式,而快捷方式位于完全不同的位置,这也是正确的。您是指指向当前目录的相对路径,即工作目录,还是相对于.exe的位置?有两种相对路径。一个if的形式为“A\B\C”,并不意味着一个特定的基。另一个格式为“\A\B”或“.\A\B”;这些是相对于当前工作目录的。@Amit Dhall:顺便说一句,接受并投票选出对您有帮助的答案是件好事。只需小心使用Path.Combine。如果“相对”部分以斜杠开头,它可能不会执行您认为会执行的操作。@silky:那么它不是相对的,是吗?似乎是
路径。Combine
甚至不能处理驱动器相对路径。它只是忽略了它看起来的初始路径。我正在发布我自己的完整解决方案。这无法处理相对路径。它只接受目录和文件名。如果第二个参数以任何类似
的开头,它将产生垃圾。@JonathanWood实际上,该“垃圾”(其中包含
的路径)被.Net中的所有文件操作系统完全接受并解析。如果它困扰您,请对其执行
absolute=Path.GetFullPath(absolute)
。这是一个很好的解决方案,因为它根据基本路径组合了绝对路径或相关路径。在我看来,relativePath参数应该重命名为Absolute或relativePath,因为它真正代表的是什么。谢谢,如果这已经是一条绝对路径,那只是一个特例,真的。。。这个函数仍然是用来解析相对路径的,lol。我只是在这里把它命名为,以明确哪个参数是哪个;)@JulioNobre特别是因为这里的参数与
Path.Combine相比是相反的。这很容易修复,但我避免使用它,因为我经常使用它来解析工作目录上的相对路径,并且将null作为第一个参数看起来很奇怪。我感谢您的建议,但我只打算在需要将基本路径与另一个路径相结合时使用此帮助器,该路径可能是相对于该基本路径的,也可能是绝对路径。这就是为什么我更喜欢采用以下签名:GetAbsolutePath(String BasePath,String RelativeOrAbsolutePath)。如果某个参数为null,则会引发一个异常,以强调使用此方法必须同时使用这两个参数。再次感谢:-)是的,这是明智的。不必费心编辑这篇文章,只是为了摆弄一些论点。你在重新发明轮子<代码>路径。GetFullPath将自动解析。\n和..\n。另外,一般来说,您正在向String类添加
AbsolutePath
扩展函数。。。可能有点过头了。我说Path.GetFullPath始终将基本目录视为应用程序AppDomain的当前目录,这是不是说错了。在这种情况下,Path.GetFullPath无法从其他目录返回完整路径。然而,下面的算法考虑到了这一点。。。我的意思是,您只需要添加另一个可选参数,它将替换CurrentDomainDirectory。