Подтвердить что ты не робот

Каков правильный способ проверить, является ли путь UNC-контуром или локальным путем?

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

public static bool IsUncDrive(this DriveInfo info) {
  Uri uri = null;
  if ( !Uri.TryCreate(info.Name, UriKind.Absolute, out uri) ) {
    return false;
  }
  return uri.IsUnc;
}

Ответ 3

Самый точный подход будет заключаться в использовании некоторого кода взаимодействия из файла 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 имеет лучший ответ, используя чисто управляемый код.

Ответ 4

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

Ответ 5

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

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.

Ответ 6

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

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

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

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

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