\\?\
- это расширенный префикс длины пути, который при переходе к 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.
Связанные с: