【実務・中級編】【ロングパス260文字制限回避】\\?\ UNCプレフィックスを用いた深層階層パスへのファイル操作対応策 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

【VBScriptの深淵】MAX_PATHの呪縛を解く:`\\?\` プレフィックスによるパス長制限の完全突破術

現場で業務自動化を推進していると、必ず遭遇する壁がある。それがWindowsのファイルシステムが抱える歴史的遺産、「MAX_PATH(260文字制限)」だ。

「自動化ツールを作ったが、特定の階層が深いフォルダでだけエラーになる」。そんな報告が上がったとき、お前はファイル名の短縮を指示するのか? それともOSの仕様を言い訳にするのか?

一流のエンジニアであれば、OSの挙動をねじ伏せる。今回は、VBScriptを使ってこの制限をエレガントに、かつ堅牢に回避する技術を伝授する。

1. なぜ「260文字」で止まるのか?

WindowsのAPI(`CreateFile`など)には、歴史的な理由からパスの長さを`MAX_PATH`(260文字)に制限する仕様が根深く残っている。これはNTFSが理論上は32,767文字まで扱えるにもかかわらず、Win32 APIの多くがこの古いバッファサイズに依存しているからだ。

この制限を無視して無理やり処理を続ければ、スクリプトは容赦なく「パスが見つかりません」というエラーを吐き、運用担当者を路頭に迷わせる。

2. 禁断の鍵:UNC拡張プレフィックス `\?\`

この呪縛を解く唯一にして最強の鍵が、パスの先頭に付与する `\\?\` (UNCプレフィックス) だ。

これを付与することで、Windows APIに対し「このパスはWin32 APIの制限を受けないロングパスである」と明示的に伝えることができる。

  • 通常のパス: `C:\Project\Data\…\file.txt` (260文字制限あり)
  • 拡張パス: `\\?\C:\Project\Data\…\file.txt` (約32,000文字まで対応)

ただし、注意点が一つ。`\\?\` を使用する場合、パスは必ず「絶対パス」である必要がある。相対パス(`.\` や `..\`)は一切通用しない。ここを理解していないエンジニアが現場で最もバグを生む。

3. 実践:堅牢なファイル操作のためのプロダクション・コード

現場ですぐに使える、`Scripting.FileSystemObject (FSO)` を用いたロングパス対応のテンプレートを公開する。

‘ ==============================================================================
‘ Function: GetLongPath
‘ Description: 通常パスを\\?\UNC拡張パスへ変換する。絶対パス化を保証する。
‘ ==============================================================================
Function GetLongPath(strPath)
Dim objFSO
Set objFSO = CreateObject(“Scripting.FileSystemObject”)

‘ 絶対パスに変換(UNCプレフィックス付与には必須)
Dim absPath
absPath = objFSO.GetAbsolutePathName(strPath)

‘ すでにプレフィックスがあるか確認し、なければ付与
If Left(absPath, 4) <> “\\?\” Then
GetLongPath = “\\?\” & absPath
Else
GetLongPath = absPath
End If

Set objFSO = Nothing
End Function

‘ — 利用例:深い階層のファイル操作 —
Dim targetPath, fso, file
targetPath = “C:\Very\Deep\Folder\…\Target.txt”
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ ロングパスに対応したパスを取得
Dim longPath
longPath = GetLongPath(targetPath)

‘ ファイル操作(FSOはUNCパスを透過的に扱えるケースが多いが、
‘ APIの挙動に左右されるため、常にパスを正規化しておくのが鉄則)
If fso.FileExists(longPath) Then
WScript.Echo “ファイルを発見: ” & longPath
‘ ここに処理を記述
Else
WScript.Echo “ファイルが存在しません。階層を確認してください。”
End If

開発リーダーからの鋭い提言

  • FSOの限界を理解せよ: `Scripting.FileSystemObject` は非常に便利だが、一部のメソッドは依然として内部的に260文字の壁にぶつかることがある。もしFSOで挙動が怪しい場合は、`WScript.Shell` の `Run` コマンドで `cmd.exe /c` を経由し、外部コマンド(`robocopy` や `powershell`)に処理を委譲する判断も必要だ。
  • データベース連携の罠: データベースにパスを保存する場合、カラムの長さを `VARCHAR(260)` で定義していないか? ロングパスを扱うなら、DB側の定義も `NVARCHAR(MAX)` 等へ即座に変更する必要がある。

まとめ

技術とは、単にAPIを呼び出すことではない。「なぜその制限が存在するのか」「どうすればその境界線を越えられるのか」という仕組みへの理解が、コードの寿命を決め、保守コストを下げる。

`\\?\` プレフィックスを使いこなすことは、お前が「表面的なコーダー」から「真のシステムアーキテクト」へと脱皮するための第一歩だ。現場の泥臭い課題こそ、最高の腕試しの場だと思って楽しんでくれ。

何か不明点があればいつでも聞け。ただし、コードの「意図」を説明できるレベルまで噛み砕いてから質問することだ。期待している。

タイトルとURLをコピーしました