Получите информацию о безопасности, указав слишком длинный путь к файлу, превышающий 260 символов: C#

Я пытаюсь получить информацию о безопасности некоторых файлов и каталогов внутри сетевой папки. К сожалению, некоторые пути к файлам и каталогам превышают ограничения на символы 260/248 соответственно. Я нашел так много информации, чтобы использовать Win32 P/Invoke, использовать.NET Framework 4.6.2 и т. Д. Я смог использовать код Кима Гамильтона для перебора всех файлов и каталогов внутри, чей путь превышает ограничение длины, но я не мог использовать это получить информацию о безопасности.

Ниже приведен мой простой код C#, содержащий путь длиной более 260 символов. Это бросит путь слишком длинное исключение. Не могли бы вы помочь мне решить эту проблему в этом сценарии.

using System.IO;
using System.Security.AccessControl;

namespace Microsoft.Experimental.IO
{
    class Program
    {
        public static void Main(string[] args)
        {
            string path = @"\\Domain\UserData\VeryLongPath";  //This is above 260 characters
            DirectoryInfo info = new DirectoryInfo(path);
            DirectorySecurity security = Directory.GetAccessControl(path);

        }
    }
}

1 ответ

Решение

Я видел в некоторых других сообщениях, что установка.NET Framework 4.6.2 действительно помогает. В крайнем случае я попробовал. У меня была Visual Studio 2015. Я установил.NET Framework 4.6.2. Это все еще не работало. Затем я установил Visual Studio 2017 и выбрал .NET Framework 4.6.2. Это исключило Path Too Long Exception. Но это дало новое исключение под названием Неверное имя, Неверный параметр.

Один из моих коллег предложил мне проверить значение реестра

Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled

Первоначальное значение было равно 0. Я установил его на 1. И "Путь слишком длинный", и "Неверное имя", исключение "Неверный параметр" пропало. Я считаю, что этот раздел реестра не существует на компьютере, на котором нет.NET Framework 4.6.2.

Принятый ответ на самом деле не сработал для меня, хотя я проверил ключ реестра (в настоящее время он, похоже, включен по умолчанию). Вызванное исключение было, как упомянуто: недопустимое имя, недопустимый параметр (произошло наSetAccessControlв моем случае). .NET 4.7.2

Помог особый синтаксис: \\?\ для локальных путей или \\?\UNC\ для сетевых ресурсов.

Итак, для рассматриваемого примера (общий ресурс сервера) это будет примерно так:

var security = Directory.GetAccessControl($@"\\?\UNC\{path.TrimStart('\\')}");
Другие вопросы по тегам