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

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

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

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);

        }
    }
}

person Merin Nakarmi    schedule 04.04.2018    source источник
comment
Ваша ошибка связана с ограничениями DOS. Лучшее решение — смонтировать диск на ПК, а затем использовать букву диска для доступа к информации о файле.   -  person jdweng    schedule 05.04.2018
comment
@jdweng: Звучит хорошая идея. Это действительно спасет некоторых персонажей. Но что, если он все равно превысит лимит в 260 символов?   -  person Merin Nakarmi    schedule 05.04.2018
comment
Затем сопоставьте диск с другой папкой ближе к фактической папке. Путь к картографическому диску не ограничен. Пользовался этим методом много раз. Часто сталкивались с этой проблемой с файлами Excel. Поэтому, если вы сопоставите диск \\Domain\UserData\VeryLongPath с P:, тогда имя вашего файла будет только P:\\filename   -  person jdweng    schedule 05.04.2018
comment
@jdweng: К сожалению, это не сработало для меня, друг. У меня подключены диски P и G. Это дало одинаковые исключения на обоих дисках. :( Я ценю ваши усилия, пытающиеся мне помочь.   -  person Merin Nakarmi    schedule 06.04.2018
comment
Тогда вы не используете подключенный диск для сокращения имени пути.   -  person jdweng    schedule 06.04.2018


Ответы (2)


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

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

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

var security = Directory.GetAccessControl($@"\\?\UNC\{path.TrimStart('\\')}");
person Programmierus    schedule 07.11.2019

В некоторых других сообщениях я видел, что установка .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.

person Merin Nakarmi    schedule 06.04.2018