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

Другие вопросы по тегам