在C#中,如何检查路径是否为虚拟路径?

17

可能的虚拟路径:

/folder1/folder2/image.jpg
~/folder1/folder2/image.jpg
folder1/folder2/image.jpg

具体路径:

C:\folder1\folder2\image.jpg
D:\folder1\folder2\image.jpg
C:/folder1/folder2/image.jpg
C:/folder1\folder2/image.jpg

如何检查路径是否为虚拟路径,而且不容易出错?我之所以问这个问题是因为当我在具体路径上使用Server.MapPath()时,它会抛出异常。但是,我传递给 Server.MapPath() 的内容可以是我提供的任何一个示例,在运行时我不知道它是什么。


1
你不能检查它是否以 X: 开头吗? - BrunoLM
6个回答

19

这对我来说运作得足够好:

protected string GetPath(string path)
{
    if (Path.IsPathRooted(path))
    {
        return path;
    }

    return Server.MapPath(path);
}

3
这将不适用于"/folder1/folder2/image.jpg",它将返回"true"。 - Jimbo
因为 Path.IsPathRooted("/folder1/folder2/image.jpg"); 返回了 true,而实际上应该返回 false,所以被踩了。 - Giuseppe Romagnuolo
这在“某些”情况下可以工作,但对于以“/”开头的路径将失败。 - user1751825
在检查之前添加 path.TrimStart('\\', '/') 怎么样? - mkb

8

我是新来的,请问如何取消我的操作? - LuckyMN Z

1
您可以使用以下正则表达式...
^(?:[a-zA-Z]:(?:\\|/)|\\\\)

如果您希望始终拥有映射路径,可以使用以下一行代码...

VB.Net

my_path = If(Regex.IsMatch(my_path, "^(?:[a-zA-Z]:(?:\\|/)|\\\\)"), my_path, Server.MapPath(my_path))

C#

my_path = Regex.IsMatch(my_path, @"^(?:[a-zA-Z]:(?:\\|/)|\\\\)") ? my_path : Server.MapPath(my_path);

这应该可以正确地处理常规驱动器路径"c:\",以及UNC路径"\\"。


1

我会使用Reflector来检查Server.MapPath()的作用并执行它。 :)

另一种选择可能是System.IO.Path.GetPathRoot() - 如果返回null,那么它就是相对路径。不过这有点像hack,因为它对Web路径一无所知,所以如果它能工作,那只是巧合。


1
我之所以提问,是因为当我在具体路径上使用Server.MapPath()时,它会抛出异常。它是否会抛出特定于此类型条件的异常,或者它会抛出通用异常?如果异常特定于输入路径为具体路径的条件,我将在您的代码中捕获该特定异常。即使它是通用异常,我仍然会捕获这个异常。您可能无法解码它是因为输入路径是虚拟的而抛出的异常,但您至少可以编写自己的异常消息,包括一个提醒,它可能是由输入路径是虚拟的引起的。
我相信这是最少出错的解决方案,因为您依赖于Server.MapPath()实现来确定它失败的条件,而不是尝试创建一个试图做同样事情的冗余包装器。将来MapPath()的功能可能会发生改变,它可能会开始支持虚拟路径,那么你实际上会有防止使用这种方式的代码是愚蠢的。

0

// Path.IsPathRooted("/folder1/folder2/image.jpg"); 返回 true

 public void Main()
        {
            var path = @"/folder1/folder2/image.jpg";
            //is valid path?
            if (!System.IO.Path.GetInvalidPathChars().Any(c => path.Contains(c.ToString())))
            {

                if (IsAbsolutePhysicalPath(path))
                {
                    // This is the full path
                }
                else
                {
                    // This is not the full path
                }

            }
        }
        private bool IsAbsolutePhysicalPath(string path)
        {
            if (path == null || path.Length < 3)
                return false;

            // e.g c:\foo
            if (path[1] == ':' && IsDirectorySeparatorChar(path[2]))
                return true;

            // e.g \\server\share\foo or //server/share/foo
            return IsUncSharePath(path);
        }
        private bool IsDirectorySeparatorChar(char ch)
        {
            return (ch == '\\' || ch == '/');
        }

        private bool IsUncSharePath(string path)
        {
            // e.g \\server\share\foo or //server/share/foo
            if (path.Length > 2 && IsDirectorySeparatorChar(path[0]) && IsDirectorySeparatorChar(path[1]))
                return true;
            return false;

        }

Reference: http://referencesource.microsoft.com/#System.Web/Util/UrlPath.cs,5e5cf20a50a858e2


使用正则表达式可以更容易地完成此操作。正则表达式可以在一行代码中完全实现相同的功能。 - user1751825

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