以前にファイルサーバーの移行を行った際に確認として Dir コマンドでファイル数の一致を確認していたことがあったのですが、robocopy コマンドの結果を見てもエラーがないにも関わらず、移行元と移行先での実行結果でファイル数が一致しない、という事がありました。
エクスプローラーのトップフォルダのプロパティでもファイル数/フォルダ数も確認しており、こちらも同様に一致していないということがあり、その時に調べた内容をまとめました。
すべてのフォルダ/ファイルを表示できない理由
そもそも Dir コマンドでは通常すべてのフォルダ/ファイルを確認する事ができないのです。
すべての階層が表示されていないにも関わらず、コマンド結果ではエラー等も出力されないため、知らなければすべて出力されているものと判断してしまう可能性があります。(260 文字を超えたパスはフォルダ名の途中であろうが切れたまま出力されます。)
これは、Windows でサポートされているパス長がデフォルトで 260 文字までという制限があり、それを超える長さのパスは表示することができないという仕様のためです。
win32 系アプリケーションの場合に上記の動作となりますので、エクスプローラー側からプロパティを開いて確認したところで 260 文字までのパスの範囲でのフォルダ/ファイル数までしか確認することができません。
パス260文字制限の回避方法
これを回避する方法として、以下の 2 つがあります。
- フォルダ構造の最下層まで確認できる位置(想定される最下層からカウントして 260 文字を超えない位置)を判断して、特定の階層から始まるようにフォルダをマウントする
- 260 文字制限のレジストリ設定を解除した状態で Get-ChildItem -Recurse コマンドで確認する
※こちらの方法は、Windows10 Version 1607 以降でサポートされている方法となります。
通常利用の範囲であれば、1 の方法で問題ないかと思いますが、フォルダの一致を確認するような場合は 2 の対応になるかと思います。
今回はこちらの 2 のレジストリ設定の解除方法についてご紹介します。
パス260文字制限の解除方法
まず、レジストリ設定の方法としては、「レジストリ エディター」がありますが、一つ一つ辿っていくのが大変なので PowerShell コマンドで行います。
レジストリキーの確認(LongPathsEnabled)
パスの 260 文字制限の「LongPathEnabled」レジストリキーの既定値が “0” となりますので、現在の設定値の確認を行い、既定値であれば変更するという流れになります。Windows PowerShell を起動し、以下のコマンドを実行します。
※管理者として実行した PowerShell にて操作を行います。
コマンド例
(Get-Item -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem").GetValue("LongPathsEnabled") 0
コマンド実行例
PS C:\> (Get-Item -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem") Hive: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control Name Property ---- -------- FileSystem DisableDeleteNotification : 0 FilterSupportedFeaturesMode : 0 LongPathsEnabled : 0 NtfsAllowExtendedCharacter8dot3Rename : 0 NtfsBugcheckOnCorrupt : 0 NtfsDisable8dot3NameCreation : 2 NtfsDisableCompression : 0 NtfsDisableEncryption : 0 NtfsDisableLastAccessUpdate : 1 NtfsDisableLfsDowngrade : 0 NtfsDisableVolsnapHints : 0 NtfsEncryptPagingFile : 0 NtfsMemoryUsage : 0 NtfsMftZoneReservation : 0 NtfsQuotaNotifyRate : 3600 RefsDisableLastAccessUpdate : 1 ScrubMode : 1 SymlinkLocalToLocalEvaluation : 1 SymlinkLocalToRemoteEvaluation : 1 SymlinkRemoteToLocalEvaluation : 0 SymlinkRemoteToRemoteEvaluation : 0 UdfsCloseSessionOnEject : 3 UdfsSoftwareDefectManagement : 0 Win31FileSystem : 0 Win95TruncatedExtensions : 1 NtfsAllowExtendedCharacterIn8dot3Name : 1 PS C:\>
レジストリ「LongPathsEnabled」の値が “0” であれば、次の手順へ進みます。
レジストリキーの変更(LongPathsEnabled)
では、パス 260 文字制限の解除を行っていきます。レジストリ「LongPathsEnabled」設定を “1” へ変更します。
コマンド例
Set-ItemProperty "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" -Name LongPathsEnabled -value 1
エラーなく終了したら設定値の変更は完了です。
設定変更後に確認コマンドを実行し、出力結果が “1” となっていれば変更は完了しています。
コマンド例
(Get-Item -Path "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem").GetValue("LongPathsEnabled") 1
これによりパスの 260 文字制限は解除することができます。