Как правильно проверить, является ли путь UNC или локальным? - PullRequest
21 голосов
/ 06 февраля 2009

Самый простой способ проверить, является ли путь UNC-путем, конечно, проверить, является ли первый символ в полном пути буквой или обратной косой чертой. Это хорошее решение или могут быть проблемы с ним?

Моя конкретная проблема заключается в том, что я хочу создать объект System.IO.DriveInfo, если в пути есть буква диска.

Ответы [ 6 ]

16 голосов
/ 06 февраля 2009

Попробуйте этот метод расширения

public static bool IsUncDrive(this DriveInfo info) {
  Uri uri = null;
  if ( !Uri.TryCreate(info.Name, UriKind.Absolute, out uri) ) {
    return false;
  }
  return uri.IsUnc;
}
14 голосов
/ 06 февраля 2009

Поскольку путь без двух обратных слешей в первой и второй позициях по определению не является UNC-путем, это безопасный способ сделать это определение.

Путь с буквой диска в первой позиции (c :) является корневым локальным путем.

Путь без этих вещей (myfolder \ blah) является относительным локальным путем. Это включает путь только с одной косой чертой (\ myfolder \ blah).

13 голосов
/ 06 февраля 2009

Наиболее точным подходом будет использование некоторого кода взаимодействия из shlwapi.dll

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
[ResourceExposure(ResourceScope.None)]
[return: MarshalAsAttribute(UnmanagedType.Bool)]
internal static extern bool PathIsUNC([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath);

Тогда вы бы назвали это так:

    /// <summary>
    /// Determines if the string is a valid Universal Naming Convention (UNC)
    /// for a server and share path.
    /// </summary>
    /// <param name="path">The path to be tested.</param>
    /// <returns><see langword="true"/> if the path is a valid UNC path; 
    /// otherwise, <see langword="false"/>.</returns>
    public static bool IsUncPath(string path)
    {
        return PathIsUNC(path);
    }

@ JaredPar имеет лучший ответ, используя чисто управляемый код .

5 голосов
/ 20 сентября 2013

Одна хитрость, которую я нашел, заключается в использовании dInfo.FullName.StartsWith(String.Empty.PadLeft(2, IO.Path.DirectorySeparatorChar)), где dInfo - объект DirectoryInfo - если эта проверка возвращает True, то это UNC-путь, в противном случае это локальный путь

4 голосов
/ 19 сентября 2013

Это моя версия:

public static bool IsUnc(string path)
{
    string root = Path.GetPathRoot(path);

    // Check if root starts with "\\", clearly an UNC
    if (root.StartsWith(@"\\"))
    return true;

    // Check if the drive is a network drive
    DriveInfo drive = new DriveInfo(root);
    if (drive.DriveType == DriveType.Network)
    return true;

    return false;
}

Преимущество этой версии перед версией @JaredPars заключается в том, что она поддерживает любой путь, а не только DriveInfo.

0 голосов
/ 10 октября 2014

Может быть, этот ответ может быть полезен для тех, кто хочет проверить только UNC-сервер + share + подкаталоги , например, путь к сетевому хранилищу, например

  • \\Server1\Share1
  • \\Server2\Share22\Dir1\Dir2
  • \\Server3

Используйте следующее регулярное выражение:

^\\\\([A-Za-z0-9_\-]{1,32}[/\\]){0,10}[A-Za-z0-9_\-]{1,32}$
  • заменить 32 (2 раза) максимально допустимой длиной имени сервера / каталога
  • заменить 10 на максимально допустимую глубину пути (максимальное количество каталогов)
  • продлевать [A-Za-z0-9_\-] (2 раза), если вам не хватает какого-либо символа, разрешенного в имени сервера / каталога

Я успешно проверил это. Наслаждайтесь!

...