解決 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. 找到具有長路徑的資料夾,如下圖所示,其中資料夾名稱是一串隨機字母和數字。

這個神秘訊息背後的主要原因之一是 Windows 作業系統所施加的 MAX_PATH 限制(260個字元)。這個限制是為了保持不同應用程式和系統之間的相容性。

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,一個功能強大的檔案壓縮和封存工具。

要在長檔案路徑上進行檔案操作,請完成以下步驟:

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)的擴充,提供GUI界面來管理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指令,將symlink.txt檔案及其所有相關資訊(/COPYALL)從來源($srcPath)複製到目的地($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 cmdlet中利用-LiteralPath參數

您已經利用Robocopy的功能來處理複雜的檔案管理路徑。然而,仍然有一個疑問:如何進一步增強您在處理檔案操作時的控制和精確性?

PowerShell提供了帶有參數的cmdlet,如-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/