Включение длинного пути к файлу в реестре и gpedit.msc не работает

Мне нужно создать папку с длинным путем к файлу более 250 символов, используя powershell cmd.

Я сделал следующие вещи,

1. В этом пути реестра «HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem» я изменил значение для LongPathsEnabled на «1»

2, я включил длинный путь к файлу в «Политика локального компьютера> Конфигурация компьютера> Административные шаблоны> Система> Файловая система> Включить длинные пути Win32» (gpedit.msc)

Но при создании папки с более чем 250 символами с помощью power shell cmd возникает ошибка, как показано ниже.

«Новый элемент: указанный путь, имя файла или оба слишком длинные. Полное имя файла должно быть меньше 260 символов, а имя каталога должно быть меньше 248 символов».


person Jagan T    schedule 03.01.2020    source источник
comment
я никогда этого не делал ... но мне интересно, нужно ли вам повторно войти в систему, чтобы вызвать изменение? или, возможно, перезагрузить?   -  person Lee_Dailey    schedule 03.01.2020
comment
Обычно изменения в реестре требуют перезапуска процесса explorer.exe. Сделать это можно из диспетчера задач. А затем из команды запуска введите explorer.exe   -  person JimShapedCoding    schedule 03.01.2020
comment
я перезагрузил машину дважды после изменений в реестре. это не сработало   -  person Jagan T    schedule 03.01.2020
comment
Не уверен, но я думаю, что вам нужно использовать -LiteralPath для длинных имен файлов. К сожалению, командлет New-Item не имеет этого параметра, поэтому, возможно, сначала попробуйте создать новую папку локально, а затем использовать Copy-Item -LiteralPath .. ?   -  person Theo    schedule 03.01.2020


Ответы (1)


Примените префикс \\?\, как в следующем примере:

$longPart = $( 65..86 | ForEach-Object {
    [string][char]$_ * 10
} ) -join '\'
$Path = "\\?\D:\PShell\DataFiles\$longPart"
$longPart.Length, $Path.Length -join ','
New-Item -ItemType Directory -Path $Path
241,265


    Directory: \\?\D:\PShell\DataFiles\AAAAAAAAAA\BBBBBBBBBB\CCCCCCCCCC\DDDDDDD
    DDD\EEEEEEEEEE\FFFFFFFFFF\GGGGGGGGGG\HHHHHHHHHH\IIIIIIIIII\JJJJJJJJJJ\KKKKK
    KKKKK\LLLLLLLLLL\MMMMMMMMMM\NNNNNNNNNN\OOOOOOOOOO\PPPPPPPPPP\QQQQQQQQQQ\RRR
    RRRRRRR\SSSSSSSSSS\TTTTTTTTTT\UUUUUUUUUU


Mode                LastWriteTime         Length Name                          
----                -------------         ------ ----                          
d-----       03.01.2020     22:58                VVVVVVVVVV

О префиксе \\?\< /а>:

Для файлового ввода-вывода префикс «\\?\» к строке пути указывает API-интерфейсам Windows отключить весь синтаксический анализ строки и отправить строку, следующую за ней, прямо в файловую систему.

...

Поскольку он отключает автоматическое расширение строки пути, префикс «\\?\» также позволяет использовать «..» и «.» в именах путей, что может быть полезно, если вы пытаетесь выполнить операции с файлом с этими в противном случае зарезервированные спецификаторы относительного пути как часть полного пути.

Обратите внимание, что вы не можете использовать префикс "\\?\" с относительным путем.

Работает со следующими LongPathsEnabled в реестре:

reg.exe query "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" -v long*
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
    LongPathsEnabled    REG_SZ    1
person JosefZ    schedule 03.01.2020
comment
Если это путь UNC, вам понадобится \\?\UNC\server\share\filename.txt - person Theo; 04.01.2020
comment
@Тео, ты прав. Он указан в Ограничение максимальной длины пути того же документа, на который есть ссылка в моем ответе. Однако я не уверен, следует ли включать длинные пути для сервера, клиента или обоих? Надеюсь, такие знания мне не пригодятся:) - person JosefZ; 05.01.2020