В C # как проверить, является ли путь виртуальным или нет? - PullRequest
16 голосов
/ 13 октября 2010

Возможные виртуальные пути:

/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(), может быть любым из приведенных выше примеров, и я не знаю, что это до выполнения.

Ответы [ 6 ]

18 голосов
/ 14 июля 2011

Для меня это достаточно хорошо работает:

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

    return Server.MapPath(path);
}
8 голосов
/ 13 октября 2010

Будет ли Path.GetFullPath(string path) соответствовать вашим потребностям?Вы можете использовать этот метод, а затем сравнить, если путь изменился.

if (path == Path.GetFullPath(path))
{
    // This is the full path (no changes)
}
else
{
    // This is not the full path i.e. 'virtual' (changes)
}

Ссылка: http://msdn.microsoft.com/en-us/library/system.io.path.getfullpath.aspx

1 голос
/ 26 апреля 2016

Вы можете использовать следующее регулярное выражение ...

^(?:[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 голос
/ 09 августа 2013

Причина, по которой я спрашиваю, заключается в том, что когда я использую Server.MapPath () по конкретному пути, он выдаст исключение

Выдает ли оно конкретное исключение для этого типа условия или оно генерирует общее? Если исключение относится к условию, что входной путь был конкретным, я бы поймал это конкретное исключение в вашем коде. Даже если это общее исключение, я все равно поймал бы это исключение, вы не сможете декодировать, если оно было выброшено, потому что путь ввода был виртуальным, но вы можете, по крайней мере, написать собственное сообщение об исключении, включая уведомление о том, что оно может быть вызвано виртуальным входным путем.

Я полагаю, что это наименее подверженное ошибкам решение, потому что вы полагаетесь на реализацию Server.MapPath () для определения условий, при которых он не работает, вместо того, чтобы пытаться создать избыточную оболочку, которая пытается сделать то же самое. В будущем функциональность MapPath () может измениться, и он может фактически начать поддерживать виртуальные пути, тогда было бы глупо иметь код, чтобы фактически предотвратить такое использование.

1 голос
/ 13 октября 2010

Я бы использовал Reflector, чтобы проверить, что делает Server.MapPath(), и сделать это. :)

Альтернативой может быть System.IO.Path.GetPathRoot() - если он возвращает null, то это относительный путь. Это немного хакерство, так как он ничего не знает о веб-путях, поэтому, если он работает, он будет работать по совпадению.

0 голосов
/ 26 апреля 2016

// 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;

        }

Справка: http://referencesource.microsoft.com/#System.Web/Util/UrlPath.cs,5e5cf20a50a858e2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...