为什么我无法在 cmd.exe 中 mkdir \\?\%temp%\very\long\path?

为什么我无法在 cmd.exe 中 mkdir \\?\%temp%\very\long\path?

我从互联网上的几个地方发现我可以\\?\使用 NTFS 的长路径功能。但是,如果我尝试使用 在 cmd.exe 中创建长路径mkdir \\?\%TEMP%\a\very\long\path\follows,则会收到The full path of ... is too long错误。

我缺少什么以及如何创建一条长路径?

答案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\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:\longPowerShell检查创建的文件夹

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 资源管理器访问该文件夹,你也会遇到问题

有关的:

相关内容