Я узнал из нескольких мест в Интернете, что я могу использовать \\?\ использовать функцию длинного пути NTFS. Тем не менее, если я пытаюсь создать длинный путь в cmd.exe с помощью mkdir \\?\%TEMP%\a\very\long\path\follows , я получаю The full path of ... is too long ошибка.

Что мне не хватает и как я могу создать длинный путь?

1 ответ1

1

\\?\ - это расширенный префикс длины пути, который при переходе к Win32 API игнорирует ограничение MAX_PATH . Это не функция NTFS. Однако кажется, что команда mkdir анализирует эту строку перед передачей в функцию создания каталога, и это ограничение команды, а не ОС

Ключ: путь может состоять из любых допустимых символов до максимальной длины пути.

https://ss64.com/nt/md.html

В Windows 10 вы можете отказаться от ограничения пути, но в Windows 7 у вас есть только одно решение: найти программу, которая поддерживает длинные пути. Одним из них является встроенный robocopy который поддерживает длинный путь по умолчанию, и вы можете отключить его с помощью параметра /256 . Вы можете использовать параметр /E или /CREATE чтобы создать структуру папок путем копирования из фиктивного файла / папки. Например

C:\>robocopy /create C:\dummy C:\long\path\0123456789\1123456789\223456789\3123456789\4123456789\5123456789\6123456789\7
123456789\8123456789\9123456789\0123456789\1123456789\2123456789\3123456789\4123456789\5123456789\6123456789\7123456789\
8123456789\9123456789\0123456789\1123456789\2123456789\3123456789\4123456789\5123456789\6123456789\7123456789\8123456789
\9123456789\

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Robust File Copy for Windows
-------------------------------------------------------------------------------

    ... <skipping many lines>

    Files : *.*

  Options : *.* /COPY:DAT /CREATE /R:1000000 /W:30

После этого вы можете проверить созданные папки с помощью команды ls -Recurse C:\long в PowerShell.

7-zip также поддерживает длинные имена файлов. Вы можете просмотреть структуру папок и нажать F7, чтобы создать новую папку. То же самое для WinRar и Far Manager. К сожалению, они не имеют опции командной строки для создания папок

AFAIK Far Manager также поддерживает длинные пути. Он даже поддерживает сценарии, поэтому вы можете написать простой сценарий для этого. В качестве альтернативы вы можете вызвать CreateDirectoryW API непосредственно из PowerShell для создания папки, ни один из компонентов 3 - го не требуется

$Signature  = @'[DllImport("kernel32.dll", SetLastError = true,
                CharSet = CharSet.Unicode, BestFitMapping = false)]
    public static extern bool CreateDirectory([MarshalAs(UnmanagedType.LPWStr)]string path,
                                              IntPtr securityAttributes);
'@
$Kernel32 = Add-Type -MemberDefinition $Signature -Name 'Kernel32' `
                     -Namespace 'Win32' -PassThru

$pathToCreate = "long\path" + "\0123456789" * 30
$path = "\\?\C:" # or up until the folder you know that already existed
foreach ($p in $pathToCreate.Split('\')) {
    $path += '\' + $p
    $result = $Kernel32::CreateDirectory($path, [System.IntPtr]::Zero)
}
if ($result) { echo "Path created successfully" }

Но даже тогда вы столкнетесь с проблемами, если захотите получить доступ к папке из Windows Explorer.

Связанные с:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .