首页 > 解决方案 > 在注册表和 gpedit.msc 中启用长文件路径不起作用

问题描述

我需要使用 powershell cmd 创建具有超过 250 个字符的长文件路径的文件夹。

我做了以下事情,

1,在此注册表路径“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem”中,我已将 LongPathsEnabled 的值更改为“1”

2,我在“本地计算机策略>计算机配置>管理模板>系统>文件系统>启用Win32长路径”中启用了长文件路径(gpedit.msc)

但是在使用 power shell cmd 创建一个超过 250 个字符的文件夹时,它会抛出如下错误

“New-Item : 指定的路径、文件名或两者都太长。全限定文件名必须小于 260 个字符,目录名必须小于 248 个字符。”

标签: powershellfilesystemsfilepath

解决方案


应用\\?\前缀,如下例所示:

$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

关于\\?\前缀

对于文件 I/O,\\?\路径字符串的“”前缀告诉 Windows API 禁用所有字符串解析并将其后面的字符串直接发送到文件系统。

...

因为它关闭了路径字符串的自动扩展,“ \\?\”前缀还允许在路径名中使用“ ..”和“ .”,如果您尝试对具有这些否则保留的相对路径的文件执行操作,这将很有用说明符作为完全限定路径的一部分。

请注意,您不能将“ \\?\”前缀与相对路径一起使用。

LongPathsEnabled在注册表中使用以下内容:

reg.exe query "HKLM\SYSTEM\CurrentControlSet\Control\FileSystem" -v long*
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
    LongPathsEnabled    REG_SZ    1

推荐阅读