【実務・中級編】【パス解析アルゴリズム】InStrRev・Split 関数を用いた FileSystemObject に依存しない高速なファイルパス・拡張子分解 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを極める:FSOを捨てろ。文字列操作こそが「高速化」の最前線だ

現場で数万件のファイルパスを処理する際、多くの開発者が安易に `Scripting.FileSystemObject (FSO)` をインスタンス化する。だが、少し待ってほしい。君が書こうとしているそのコード、本当に「プロのエンジニア」の設計か?

FSOは便利だ。だが、ループ内で毎回生成されるオブジェクトのオーバーヘッドを考えたことはあるか? COMオブジェクトの生成は、純粋な文字列操作に比べて遥かに重い。ミリ秒を削り出す極限の環境では、「FSOに依存しない文字列解析」こそが、真のアーキテクトに求められる必須スキルだ。

今日は、VBScriptのポテンシャルを極限まで引き出す、高速かつ堅牢なパス解析アルゴリズムを授ける。

なぜFSOではなく文字列関数なのか

1. インスタンス化コストの排除: `CreateObject(“Scripting.FileSystemObject”)` はメモリとCPUを消費する。大規模なバッチ処理において、これは明確なボトルネックだ。
2. 実行環境の依存性: FSOはWindows環境に強く依存するが、文字列操作(`InStrRev` 等)はVBScriptのコア機能であり、常に安定したパフォーマンスを発揮する。
3. 例外処理の簡素化: FSOでファイルが存在しないパスを扱うとエラーが発生しやすいが、純粋な文字列操作であれば「解析」と「存在確認」を分離できるため、バグの混入を防ぎやすい。

堅牢なパス解析ロジック(プロダクション・コード)

この関数は、単にパスを分解するだけでなく、パスの末尾に区切り文字がある場合や、拡張子がないファイル名のケースなど、現場で必ず遭遇する「エッジケース」を完璧にケアしている。

‘——————————————————————————-
‘ 関数名: ParseFilePath
‘ 概要: FSOを使用せず、InStrRevとMidを用いて高速にパスを分解する
‘ 引数: fullPath – 解析対象のフルパス文字列
‘ 戻り値: 配列 (0:ディレクトリパス, 1:ファイル名, 2:拡張子)
‘——————————————————————————-
Function ParseFilePath(fullPath)
Dim dirPath, fileName, ext
Dim posSlash, posDot

‘ 1. 後ろからセパレータの位置を特定
posSlash = InStrRev(fullPath, “\”)

‘ 2. ディレクトリパスとファイル名の分離
If posSlash > 0 Then
dirPath = Left(fullPath, posSlash – 1)
fileName = Mid(fullPath, posSlash + 1)
Else
dirPath = “”
fileName = fullPath
End If

‘ 3. ファイル名から拡張子の分離
posDot = InStrRev(fileName, “.”)
If posDot > 0 Then
ext = Mid(fileName, posDot + 1)
fileName = Left(fileName, posDot – 1)
Else
ext = “”
End If

‘ 配列として返却(保守性を高めるため、名前付き定数でのアクセスを推奨)
ParseFilePath = Array(dirPath, fileName, ext)
End Function

‘ — 使用例 —
Dim result
result = ParseFilePath(“C:\Projects\AutomatedTask\Report_2023.xlsx”)

WScript.Echo “フォルダ: ” & result(0)
WScript.Echo “ファイル名: ” & result(1)
WScript.Echo “拡張子: ” & result(2)

現場でバグを生まないための「3つの鉄則」

1. 「セパレータなし」のケースを想定せよ

パスに `\` が含まれない(カレントディレクトリ指定のみなど)場合、`InStrRev` は `0` を返す。この時、`Mid` 関数の引数に `0` を渡すとランタイムエラーを引き起こす。上記のコードでは `If posSlash > 0 Then` でガードしており、この防御的プログラミングこそが堅牢なツールの要だ。

2. 拡張子の「ドット」問題

拡張子の抽出において、`InStrRev` を使用することで「ファイル名の中に複数のドットがあるケース(例: `archive.tar.gz`)」にも正しく対応できる。左から検索する `InStr` を使ってはならない。必ず右から検索せよ。

3. パフォーマンスのスケール

もし処理対象が数百万件に及ぶなら、`Array` を生成するコストすら惜しむべきだ。その場合は、関数から配列を返すのではなく、解析結果をグローバル変数に書き込むか、あるいはクラスのプロパティとして保持する設計に変更すべきだ。

結び:エンジニアの誇り

業務効率化ツールを作るということは、単に動くコードを書くことではない。「将来、そのコードをメンテナンスする人間が絶望しない設計」と、「システムに負荷をかけない美しいアルゴリズム」を追求することだ。

FSOに頼ることは悪いことではない。だが、道具の裏側にある「文字列操作」という基本原理をマスターすることで、君のコードはVBScriptの制約を超えて、より洗練されたものになるはずだ。

さあ、今すぐ不要な `CreateObject` を削除し、このロジックに置き換えてみろ。その瞬間に、君のツールの実行速度は劇的に変わるはずだ。

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