解决Windows错误:目标路径过长

你是否曾经拼命尝试移动或删除文件,却总是被一个令人沮丧的错误消息所困扰,显示“目标路径太长”?这个臭名昭著的错误比你想象的更常见,将最简单的文件管理任务变成了数字迷宫。

但不要害怕!在这个教程中,你将学会经过实战检验的策略,以征服“目标路径太长”的困境。

现在,如果你已经厌倦了觉得自己的电脑故意不合作,就留下来摆脱这个烦人的Windows错误消息吧!

先决条件

在解决“目标路径太长”错误之前,确保你具备以下必备条件:

  • A Windows computer – This tutorial uses Windows 10 for demonstrations.
  • PowerShell 5.1或更新版本 – 本教程使用的是PowerShell 7.4.0。
  • 管理权限。
  • 已安装7-zip – 本教程使用的是7-zip 23.01,撰写时的最新版本。

揭秘“目标路径太长”错误

这个晦涩的信息,“目标路径太长”,就像下面这个一样,通常是由于MAX_PATH 限制引起的,这是深深植根于Windows文件系统中的一个历史性约束。MAX_PATH 限制被设定为260个字符,长期以来一直是用户处理深度嵌套目录、复杂文件夹结构和过长文件名的一个挑战。

Demonstrating the “Destination Path Too Long” error

在本教程中,您将揭示MAX_PATH 限制的复杂性,并揭示克服这一限制的实用策略。

通过重命名父文件夹来缩短文件路径长度

想象一下,你的电脑突然决定发挥其内在的莎士比亚,并宣布:“移动还是不移动,这是个问题。”但说真的,如果你一直在为这个Windows小问题而头疼,其中一个基本的解决方法就是重命名父文件夹。

假设你有一个文件夹(包含重要文件)的名字很长,你想要将其移动或复制到另一个位置。重命名父文件夹将有助于避免“目标路径太长”错误。

为了看看如何缩短文件路径长度,请按照以下步骤操作:

1. 找到具有长路径的文件夹,如下所示,其中文件夹的名称是一堆随机的字母和数字。

以下是这个神秘消息背后的主要元凶之一:MAX_PATH 限制(260个字符),这是Windows操作系统强加的。这个限制旨在确保在各种应用程序和系统之间保持兼容性。

Locating the folder with a long name

2. 使用较短的文件夹名称重新命名文件夹(例如,备份-01)。

Renaming the folder

3. 现在,将已重命名的文件夹复制或移动到您喜欢的位置,然后查看是否仍然出现“目标路径过长错误”

Copying or moving the renamed folder to a different location

通过7-zip在长度文件路径上执行文件操作

如果更改文件夹或文件的名称不是一个关键的考虑因素,一个快速的解决方法是将它们重新命名,从而避开“目标路径过长”错误

但如果保留现有名称是至关重要的,那么是否有一种方法可以在不触发错误的情况下进行操作呢?是的,通过利用7-zip,一个强大的文件压缩和存档工具。

要通过7-zip在长度文件路径上执行文件操作,请完成以下步骤:

1. 从开始菜单或桌面快捷方式启动7-zip文件管理器。

2. 接下来,找到并右键单击目标文件或文件夹,然后从上下文菜单中选择文件操作。但在这个例子中,将文件复制(复制到)到另一个位置。

注意,文本文件具有一个非常长的文件路径。

Locating the target file or folder in 7-zip

3. 在对话框中浏览文件目标的位置,然后单击确定以确认复制文件。

7-Zip忽略了Win32API对最大路径长度的限制,这使得您可以在文件和目录上执行文件操作。

Setting the file’s destination

4. 最后,导航到您的目标位置,并验证您复制的文件是否存在。

此结果确认您已成功复制文件,通过7-Zip绕过了MAX_PATH限制。

Verifying the file copied via 7-zip exists in the target location

在Windows上启用Win32长路径支持

也许您希望在处理长文件路径时坚持使用基于Windows的解决方案,而不是依赖于像7-Zip这样的第三方工具。如果是这样,启用Windows上的Win32长路径支持提供了一个本地和集成的方法来克服臭名昭著的“目标路径过长”错误。

通过解锁Win32长路径支持,您可以使您的Windows系统优雅地处理长度较长的文件路径,而无需外部应用程序。此功能提供了一个量身定制的解决方案,与您偏好的本地Windows功能一致。

继续阅读并探索启用Win32长路径支持的不同方法。

使用注册表编辑器

启用Win32长路径支持的一个关键途径是利用注册表编辑器的强大功能。这个数字控制中心是您的Windows系统的核心,允许您精确调整设置。

要通过注册表编辑器启用Win32长路径支持,请按照以下步骤进行:

1. 打开运行对话框(Win + R),键入regedit,然后按Enter(或单击确定)启动注册表编辑器。

Launching the Registry Editor via the Run dialog

? 重要提示:在对注册表编辑器进行任何更改之前,请创建注册表备份。这个备份是一个安全措施,允许您在出现任何复杂情况或意外问题时还原注册表。

2. 导航至以下键或将键粘贴到地址栏中以访问与文件系统行为相关的各种设置和配置。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
Accessing settings and configurations related to the file system behavior

3. 查找并双击LongPathsEnabled条目(右侧窗格)以访问其关联数据,并将值数据0更改为1

此条目告诉系统启用 Win32 长路径支持。

Enabling the Win32 long path support via the LongPathEnabled entry in Registry Editor

4. 退出注册表编辑器并重新启动 Windows 系统以应用更改。

5. 现在,执行文件操作,如复制或移动具有长文件路径的文件或文件夹,以查看是否可以绕过“目标路径太长”错误。

? 不幸的是,在撰写本文时,Windows 10 和 Windows Server 2022 中的本机文件资源管理器仍然面临对 NTFS 长路径的限制。如果您经常在工作流程中使用长文件路径,可以转向免费的第三方文件管理器,如OneCommanderTotalCommander

使用组策略编辑器 (GPE)

深入研究启用Win32长路径支持的复杂性会揭示出许多方法,其中最精细的之一是利用GPE。把GPE想象成您定制的工具包,用于微调Windows功能。

在赋予系统扩展路径功能的能力时,GPE占据中心舞台,提供了集中和系统化的方法。

要通过GPE启用Win32长路径支持,请执行以下操作:

1. 通过运行对话框打开GPE(gpedit.msc),如下所示。

GPE是Microsoft Management Console(MMC)的一个插件,提供了一个用于管理Windows策略设置的图形用户界面。

Opening the GPE via the Run dialog

2. 接下来,在GPE的主窗口中启用Win32长路径支持,方法如下:

  • 在控制台树(左窗格)中导航至计算机配置管理模板系统文件系统。这样做可以让您访问与文件系统相关的策略设置。
  • 查找并双击启用Win32长路径策略设置(右窗格)。选择的策略设置的配置对话框将显示出来(步骤三)。
Accessing the configuration dialog for the “Enable Win32 long paths” policy setting

3. 随后,在配置对话框中选择已启用选项,然后单击确定以启用Windows的Win32长路径支持。

Enabling the Win32 long paths support for Windows via GPE

4. 现在,复制或移动具有长文件路径的文件或文件夹,以测试Win32长路径支持。

为长路径创建符号链接

除了启用Win32长路径支持之外,规避文件路径过长的另一选项是创建数字快捷方式——符号链接。

创建符号链接就像在文件柜中放置了一个隐藏的门一样。打开它,你将找到通往文件的快捷通道,而不会影响现有的结构。

要为长路径创建符号链接,请执行以下步骤:

1. 启动以管理员身份运行的命令提示符,并执行以下mklink命令以在指定的目标路径(即C:\folder-link)创建目录符号链接(/D)。

符号链接指向具有过长路径的文件夹。因此,请用目标路径替换<symlink>,用您的长路径替换<long-path>

mklink /D <symlink> <long-path>
Creating a symbolic link for a folder

2. 接下来,运行以下dir命令,检查目录符号链接是否存在。

dir <symlink>
Checking if the directory symbolic link exists

3. 在您的长路径文件夹内,创建一个名为symlink.txt的文本文件,它作为您的符号链接正常工作的证明。

?本教程使用名为Directory Opus的第三方文件管理器,类似于XYplorer。两者都是设计用于增强Windows上文件管理体验的功能丰富的文件管理器。

Creating a text file to serve as proof that the symbolic link works

4. 最后,在文件管理器中找到并导航到您新创建的目录符号链接,确认它指向您的长路径文件夹。

现在,您可以将文件复制或移动到目标文件夹,无视 MAX_PATH 限制。

Verifying the directory symbolic link points to the long path folder

使用 Robocopy 命令进行文件操作

也许创建符号链接不在您的计划之内,但您正在寻找直接的文件操作,比如从一个文件夹复制文件到另一个文件夹,或者反之,这样的话,您需要Robocopy,这是一个强大的解决方案,可以将文件传输的烦恼变成一种无缝体验。

要通过 Robocopy 命令执行文件操作,请按照以下步骤进行:

1. 以管理员身份打开 PowerShell 并执行以下命令来声明变量,以保存目标文件的源路径和目标路径。

这些命令没有输出,但请确保您相应地替换 <source><destination> 占位符。

$srcPath=<source>
$destPath=<destination>
Declaring variables to hold the target file’s source and destination paths

2. 接下来,运行以下robocopy命令,从源路径($srcPath)复制symlink.txt文件及其所有信息(/COPYALL)到目标路径($destPath)。

该命令确保目标文件在复制操作期间无需等待(/W:0)或重试(/R:0)以应对错误。

robocopy $srcPath $destPath symlink.txt /COPYALL /W:0 /R:0

? 也许您想将文件移动到其他位置。如果是这样,请将/COPYALL替换为/MOVE选项,如下所示。此选项告诉robocopy执行“剪切和粘贴”操作。

robocopy $srcPath $destPath symlink.txt /MOVE /W:0 /R:0

下面的输出确认您已成功复制了一个文件,而无论路径多么复杂。

Copying a file via the robocopy command bypassing the MAX_PATH limit

3. 现在,运行以下Get-ChildItem cmdlet来验证已复制的文件是否存在于指定位置。

Get-ChildItem $destPath
Verifying the copied file exists in the specified location

在PowerShell cmdlets中利用-LiteralPath参数

您已经利用了Robocopy的强大功能来浏览文件管理的复杂路径。然而,一个悬而未决的问题仍然存在:如何进一步增强您在处理文件操作时的控制和精度?

PowerShell提供了带有参数的cmdlets,比如-LiteralPath,让您征服文件管理的复杂性。

要使用-LiteralPath参数执行文件操作,请执行以下操作:

1. 以管理员身份打开 PowerShell 并执行以下命令来声明变量以保存源文件路径和目标路径。

确保你用你的文件完整路径替换 <source\symlink.txt><destination> 替换成你偏好的目标路径。

$srcPath=<source\symlink.txt>
$destPath=<destination>

2. 接下来,运行下面的 Copy-Item 命令来将 symlink.txt 文件复制到指定的目标路径 ($destPath)。使用 -LiteralPath 参数可以让你以字面方式指定文件路径,而不会解释任何通配符字符。

当此命令成功执行时,控制台不会输出任何内容,但你将在下一步验证结果。

Copy-Item -LiteralPath $srcPath -Destination $destPath

? 在必要时,-LiteralPath 也可与其他用于文件操作的 cmdlet 一起使用,例如 Move-ItemRename-ItemRemove-Item

3. 最后,运行以下 Get-ChildItem 命令,列出目标路径 ($destPath) 中的文件和文件夹。

Get-ChildItem $destPath
Verifying the file has been copied successfully to the destination path

? 虽然 -LiteralPath 的工作效果非常出色,但此参数主要用于指定源路径或文件名。但在脚本场景中,-LiteralPath 确保脚本在指定的确切路径上运行,减少由于意外字符解释而导致的错误风险。

通过 Expand-Archive 命令提取存档文件

假设您已下载了一个具有极长名称的存档文件(ZIP),您希望在不更改名称的情况下提取它。在这种情况下,PowerShell 的 Expand-Archive 命令可能是一个实用的解决方案。

Expand-Archive 命令允许您从存档中解压缩或提取文件,并提供处理长路径的灵活性。

要利用Expand-Archive命令提取存档文件,请执行以下操作:

1. 在 PowerShell 中(作为管理员)执行以下命令,声明变量以保存存档文件的完整路径和目标路径。

$srcPath=<source\file.zip>
$destPath=<destination>

2. 声明变量后,运行下面的Expand-Archive命令,它不会提供任何输出,但会将存档文件提取到指定的目标位置。

Expand-Archive -Path $srcPath -DestinationPath $destPath

3. 最后,运行下面的Get-ChildItem命令,以查看目标路径($destPath)中的文件和文件夹列表。

Get-ChildItem $destPath

请注意输出中的两个项目:存档文件(红色文本)和提取的文件夹(蓝色高亮显示)。此输出确认您已成功提取存档文件,而没有触发“目标路径过长”错误。

Verifying the contents of the destination path

结论

在这个过程中,您已经掌握了一系列策略,以克服 Windows 上臭名昭著的“目标路径过长”错误。您已经探索了各种技术,从重命名父文件夹到使用 7-zip 和启用 Win32 长路径支持的威力。

符号链接提供了一个聪明的解决方法,而强大的Robocopy展示了其对高效文件操作的娴熟技能。您对PowerShell的深入研究展示了-LiteralPath参数和Expand-Archive命令的实用性。所有这些都证明了在不屈服于路径长度限制的情况下提取文件的无价之处。

现在,为什么不考虑结合这些策略来创建针对您特定挑战的强大解决方案呢?在PowerShell中尝试脚本编写,根据需要集成符号链接,并使用Robocopy调整文件操作。

记住,关键不仅在于解决眼前的问题,还在于理解这些方法如何协同工作来解决各种与文件相关的挑战。

Source:
https://adamtheautomator.com/destination-path-too-long/