Каков правильный способ проверить, является ли путь UNC-контуром или локальным путем?
Самый простой способ проверить, является ли путь UNC-путём, конечно, проверить, является ли первый символ в полном пути буквой или обратным слэшем. Это хорошее решение или могут быть проблемы с ним?
Моя особая проблема в том, что я хочу создать объект System.IO.DriveInfo, если в пути есть буква диска.
Ответы
Ответ 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 раза), если вам не хватает какого-либо символа, разрешенного в имени сервера/каталога
Я успешно протестировал его. Наслаждайтесь!