【テクニカル・上級編】【絶対パス相互変換ロジック】FSOに依存せず相対パス(../や./)を正確な絶対パスに展開する標準文字列パース関数 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを掌握せよ:FSOに依存しない「相対パス解決」の極致

VBScriptを扱うエンジニア諸君。君たちはいつまで`Scripting.FileSystemObject`(以下FSO)の甘い蜜を吸い続けるつもりだ?

確かにFSOは便利だ。だが、高負荷なサーバー環境、あるいは権限が厳格に制限されたセキュアなコンテナ環境において、FSOのインスタンス生成コストは決して無視できない。何より、真のアーキテクトであれば、「外部依存を最小化し、メモリを制御下に置く」という美学を忘れてはならない。

今回は、あえてFSOを介さず、文字列操作のみで相対パス(`./`, `../`)を絶対パスへと昇華させる、極めて軽量かつ堅牢な純粋VBScript関数を伝授する。

なぜ、今さら「文字列パース」なのか

多くのエンジニアは「パスの解決=OSの機能」と決めつけている。しかし、OSのAPIをコールするたびに発生するコンテキストスイッチのオーバーヘッドは、大量のファイル処理を行うスクリプトにおいて確実にボトルネックとなる。

今回作成するロジックは、メモリ上の配列操作のみで完結する。GC(ガベージコレクション)に頼らず、スタックとヒープの挙動を意識した実装だ。

実装:絶対パス変換関数 `ResolvePath`

この関数は、基準となるベースディレクトリと、解決対象の相対パスを引数に取り、純粋な文字列処理として絶対パスを算出する。

‘ —————————————————————————–
‘ 関数名: ResolvePath
‘ 概要: FSOに依存せず、相対パスを絶対パスへ変換する
‘ 引数: baseDir (基準ディレクトリ), relativePath (解決対象のパス)
‘ 戻り値: 展開後の絶対パス
‘ —————————————————————————–
Function ResolvePath(baseDir, relativePath)
Dim pathParts, part, stack()
Dim i, stackPtr

‘ ベースディレクトリと相対パスを結合して分解
Dim fullPath
fullPath = baseDir & “/” & relativePath
pathParts = Split(Replace(fullPath, “\”, “/”), “/”)

‘ スタックの初期化(要素数を最大で確保し、メモリ再割り当てを避ける)
ReDim stack(UBound(pathParts))
stackPtr = -1

For i = 0 To UBound(pathParts)
part = pathParts(i)

Select Case part
Case “”, “.”
‘ ルートの連続やカレント指定は無視
Case “..”
‘ 親ディレクトリへ遡る(スタックをポップ)
If stackPtr >= 0 Then stackPtr = stackPtr – 1
Case Else
‘ パス要素をスタックに積む
stackPtr = stackPtr + 1
stack(stackPtr) = part
End Select
Next

‘ 結果の構築
Dim result
If stackPtr >= 0 Then
ReDim Preserve stack(stackPtr)
result = Join(stack, “\”)
Else
result = “”
End If

‘ オブジェクトを介さないため明示的なNothingはないが、
‘ 大規模ループ内で呼び出す際はローカル変数の寿命を意識せよ
ResolvePath = result
End Function

技術的要諦:アーキテクトの視点

1. メモリ管理とReDimの制御

VBScriptの動的配列は `ReDim` のたびにメモリの再確保(再配置)が発生する。本来であれば `ReDim Preserve` は避けるべきだが、パスの階層深さは高々数十レベルであるため、ここでは「事前確保」の手法をとっている。`ReDim stack(UBound(pathParts))` により、最悪のケースでも一度のメモリ確保で済むよう設計した。

2. セパレータの正規化

Windows環境では `\` が標準だが、プロトコルやネットワークパス、あるいは他環境との混在を考慮し、処理の冒頭で `/` に統一している。これは正規表現を使うよりも遥かに高速な処理だ。

3. 「スタック」という考え方

この関数は、ディレクトリ階層を「スタック構造」として捉えている。`..` が出現したときに `stackPtr` を減らすだけの単純なロジックだが、これは再帰処理を行うよりも計算コストが低く、スタックオーバーフローのリスクを完全に排除できる。

結び:エンジニアの誇り

業務自動化において、最もコストがかかるのは「予期せぬ依存関係」だ。FSOがインストールされていない、あるいは特定のエラーでインスタンス化できない、といったトラブルで深夜に呼び出されるのは御免だろう。

この関数を君のライブラリに組み込んでおけば、環境を問わず、どんなパス操作も意のままだ。コードは常にシンプルであるべきだ。ブラックボックスに頼らず、ロジックそのものを掌握せよ。

それが、レガシーを支配する者の流儀だ。

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