我从互联网上的几个地方发现我可以\\?\
使用 NTFS 的长路径功能。但是,如果我尝试使用 在 cmd.exe 中创建长路径mkdir \\?\%TEMP%\a\very\long\path\follows
,则会收到The full path of ... is too long
错误。
我缺少什么以及如何创建一条长路径?
答案1
\\?\
是一个扩展路径长度前缀当传递给 Win32 API 时,它将忽略该MAX_PATH
限制。这不是 NTFS 功能。但是,似乎mkdir
命令在传递给创建目录函数,这是命令的限制,而不是操作系统的限制
钥匙:路径可以由任何有效字符组成,但不得超过最大路径长度。
在 Windows 10 中,您可以选择取消路径限制,但在 Windows 7 中,您只有一个解决方案:找到一个支持长路径名的程序。其中之一就是内置的robocopy
默认情况下支持长路径,您可以使用选项关闭该功能/256
。您可以使用/E
或/CREATE
选项通过从虚拟文件/文件夹复制来创建文件夹结构。例如
C:\>robocopy /create C:\dummy C:\long\path\0123456789\1123456789\223456789\3123456789\4123456789\5123456789\6123456789\7123456789\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 -R C:\long
PowerShell检查创建的文件夹
7-zip 还支持长文件名。您可以使用它浏览文件夹结构,然后F7按 创建新文件夹。与 WinRar 和 Far Manager 相同。不幸的是,它们似乎没有创建文件夹的命令行选项
据我所知,Far Manager 也支持长路径。它甚至支持脚本因此您可以编写一个简单的脚本来执行此操作。或者您可以调用CreateDirectoryW()
直接从 PowerShell 使用 API 创建文件夹,无需第三个组件
$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 资源管理器访问该文件夹,你也会遇到问题