Windowsエラーの対処方法:Destination Path Too Long

「宛先のパスが長すぎる」というフラストレーションを感じるエラーメッセージに出会って、ファイルを移動または削除しようと必死になっていますか?この有名なエラーは思っているよりも一般的であり、簡単なファイル管理のタスクさえもデジタルな迷宮に変えてしまいます。

しかし、心配しないでください!このチュートリアルでは、「宛先のパスが長すぎる」というジレンマを乗り越えるための確かな戦略を学ぶことができます。

さあ、もうコンピュータが手に入りにくいと感じるのに疲れましたか?この厄介なWindowsのエラーメッセージを取り除くために、このままお付き合いください!

前提条件

「宛先のパスが長すぎる」というエラーを乗り越える前に、以下のものを揃えて旅に備えましょう:

  • A Windows computer – This tutorial uses Windows 10 for demonstrations.
  • PowerShell 5.1以降 – このチュートリアルではPowerShell 7.4.0を使用します。
  • 管理者権限。
  • 7-zipのインストール – このチュートリアルでは、執筆時点での最新バージョンである7-zip 23.01を使用します。

「宛先のパスが長すぎる」というエラーの解明

この謎めいたメッセージ、「Destination Path Too Long」は、以下のようなもので、Windowsファイルシステムに根付いた歴史的な制約であるMAX_PATHの制限から生じることがよくあります。MAX_PATHの制限は260文字に設定されており、深く入れ子になったディレクトリ、複雑なフォルダ構造、長いファイル名に対処するユーザーにとって長年の課題でした。

Demonstrating the “Destination Path Too Long” error

このチュートリアルでは、MAX_PATHの制限の複雑さを解明し、この制限を克服するための実用的な戦略を明らかにしていきます。

親フォルダの名前を変更してファイルパスの長さを短くする

コンピュータが突然シェイクスピアの内面を引き出し、「移動するか移動しないか、それが問題だ」と宣言することになったら、頭を抱えているかもしれません。しかし、真剣に言うと、このWindowsのヒックアップに頭を悩ませている場合、基本的な修正方法の1つは、親フォルダの名前を変更することです。

長い名前のフォルダ(重要なファイルを含む)を別の場所に移動またはコピーしたい場合、親フォルダの名前を変更することで「Destination Path Too Long」エラーを回避できます。

ファイルパスの長さを短くする方法を確認するために、以下の手順に従ってください。

1. 以下に示すように、長いパスを持つフォルダを見つけます。フォルダ名はランダムな文字と数字の集まりです。

この謎めいたメッセージの主な原因の一つは、Windows OSによって課されるMAX_PATH制限(260文字)です。この制限は、さまざまなアプリケーションやシステムとの互換性を維持するために存在しています。

Locating the folder with a long name

2. フォルダ名を短いものに変更します(例:Backup-01)。

Renaming the folder

3. そして、変更したフォルダを好きな場所にコピーまたは移動し、まだ「Destination Too Long Error」が表示されるか確認します。

Copying or moving the renamed folder to a different location

7-zipを使用した長いファイルパス上でのファイル操作の実行

フォルダやファイルの名前を変更することが重要な考慮事項ではない場合、迅速な対処方法はそれらの名前を変更することです。これにより、「Destination Path Too Long」エラーを回避できます。

ただし、既存の名前を保持することが重要な場合、エラーを発生させずに実行可能な方法はありますか?はい、頼りになるファイル圧縮・アーカイブツールである7-zipを活用することで可能です。

7-zipを使用して長いファイルパス上でのファイル操作を行うには、以下の手順を完了します。

1. スタートメニューまたはデスクトップのショートカットから7-zipファイルマネージャーを起動します。

2. 次に、対象のファイルまたはフォルダを見つけ、右クリックしてコンテキストメニューからファイル操作を選択します。ただし、この例ではファイルを別の場所にコピー(Copy To)します。

テキストファイルのファイルパスが非常に長いことに注意してください。

Locating the target file or folder in 7-zip

3. ダイアログボックスでファイルの保存先を参照し、ファイルのコピーを確認するためにOKをクリックします。

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長いパスのサポートを有効にする

長いファイルパスを扱う際に、サードパーティのツールである7-zipに頼らずに、Windowsベースのソリューションを使用したい場合は、WindowsでWin32長いパスのサポートを有効にすることができます。これにより、「宛先のパスが長すぎる」というエラーを回避するためのネイティブで統合されたアプローチが提供されます。

Win32長いパスのサポートを解除することで、外部アプリケーションを必要とせずにWindowsシステムが長いファイルパスを優雅に処理できるようになります。この機能は、ネイティブのWindows機能に合わせてカスタマイズされたソリューションを提供します。

以下を読んで、Win32長いパスのサポートを有効にするさまざまな方法を探ってください。

レジストリエディタを使用する

Win32長いパスのサポートを有効にするための主要な方法の1つは、レジストリエディタの力を利用することです。このデジタル制御センターは、Windowsシステムの中心部として機能し、設定を細かく調整することができます。

レジストリエディタを使用してWin32長いパスのサポートを有効にするには、以下の手順を実行してください:

1. ランダイアログ(Win + R)を開き、regeditと入力し、Enterキーを押す(またはOKをクリック)と、レジストリエディタが起動します。

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は、Windowsのポリシー設定を管理するためのGUIを提供するMicrosoft Management Console(MMC)のスナップインです。

Opening the GPE via the Run dialog

2. 次に、以下の手順に従ってGPEのメインウィンドウでWin32の長いパスのサポートを有効にします:

  • コンソールツリー(左側のペイン)で、コンピューターの構成管理用テンプレートシステムファイルシステムに移動します。これにより、ファイルシステムに関連するポリシー設定にアクセスできます。
  • 右側のペインで、Win32の長いパスを有効にするポリシー設定を見つけ、ダブルクリックします。選択したポリシー設定の構成ダイアログが表示されます(ステップ3)。
Accessing the configuration dialog for the “Enable Win32 long paths” policy setting

3. 構成ダイアログで有効オプションを選択し、OKをクリックして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

以下の出力は、長いパスに関係なく、1つのファイルが正常にコピーされたことを確認します。

Copying a file via the robocopy command bypassing the MAX_PATH limit

3. 次に、以下のGet-ChildItemコマンドを実行して、指定した場所にコピーされたファイルが存在するか確認します。

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

PowerShellのコマンドレットで-LiteralPathパラメータを活用する

すでにRobocopyのパワーを利用して、複雑なファイル管理のパスをナビゲートしてきました。しかし、まだ1つの疑問が残っています。ファイル操作をより制御し、精度を高める方法は何でしょうか?

PowerShellは、-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 は他のファイル操作のためのコマンドレットにも使用できます。例えば、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

出力には2つのアイテムが表示されます。赤色のテキストはアーカイブファイルであり、青色でハイライトされたフォルダは展開されたものです。この出力は、「Destination Path Too Long」エラーをトリガーせずにアーカイブファイルを正常に展開できたことを確認するものです。

Verifying the contents of the destination path

結論

この過程で、Windowsの「Destination Path Too Long」エラーに立ち向かうためのさまざまな戦略を学びました。親フォルダの名前変更から、7-zipの威力、Win32の長いパスサポートの有効化まで、さまざまなテクニックを探求しました。

シンボリックリンクは賢い回避策を提供し、強力なRobocopyは効率的なファイル操作の能力を示しました。PowerShellへのダイブでは、-LiteralPathパラメータとExpand-Archiveコマンドの有用性が示されました。これらすべては、パスの長さ制約に屈することなくファイルを抽出するために貴重なものでした。

では、これらの戦略を組み合わせて、特定の課題に適した堅牢なソリューションを作成することを考えてみましょう。必要に応じてシンボリックリンクを統合し、Robocopyを使用してファイル操作を微調整することで、PowerShellでスクリプトを試してみてください。

覚えておいてください。重要なのは、ただ即座の問題を解決するだけでなく、これらの方法がどのように協調してさまざまなファイル関連の課題に取り組むことができるかを理解することです。

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