UNC путь не работает с.NET?
Я запускаю очень простую программу, которая пытается перечислить файлы в папке на том же компьютере, который указан в формате UNC (как описано в http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx):
static string rootDir = @"\\?\d:\share\input";
static void Main(string[] args)
{
char[] invlidChars = Path.GetInvalidPathChars();
foreach (char invChar in invlidChars)
{
if (rootDir.Contains(invChar.ToString()))
{
Console.WriteLine("InvChar - {0}", invChar);
}
}
string[] matchFiles = Directory.GetFiles(rootDir);
}
Однако Directory.GetFiles() не работает и выдает исключение ArgumentException(которое выдается, когда - путь является строкой нулевой длины, содержит только пробел или содержит один или несколько недопустимых символов, как определено в InvalidPathChars.). Console.Writeline() ничего не печатает, что подтверждает, что в пути нет недопустимых символов. Я получаю то же исключение, когда использую "\\UNC\?\ D:\share\input" или "\\UNC\?\ Machinename\share\input" или "\\?\ Machinename\share\input".
"D:\share\input" действительно является общей папкой.
Кто-нибудь знает, что может быть не так?
Спасибо!
1 ответ
Проблема в том, что \\?\
соглашение Windows API, которое не поддерживается.NET Если вы внимательно прочитали в своей ссылке \\?\
не обозначает UNC-путь, но является специальным соглашением для Windows API:
Для файлового ввода / вывода, "
\\?\
"префикс к строке пути указывает API-интерфейсам Windows отключить весь анализ строки и отправить строку, следующую за ней, прямо в файловую систему.
.NET-совместимый формат UNC будет \\machinename\d$\share\input
, Смотрите этот ответ для получения дополнительной информации.
Причина, по которой он не поддерживается.NET, скорее всего, заключается в том, что соглашение о расширенных путях доступно не на всех платформах и, следовательно, не может быть гарантировано, что фреймворк будет работать.