【入門編】【ファイル排他検知】他プロセスによるファイル使用(ロック状態)を安全に判定する試行関数 – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

【VBScript】「そのファイル、触っちゃダメ!」を確実に検知する――ファイル排他ロック判定の極意

こんにちは。自動化の現場で数々のスクリプトを書いてきたエンジニアです。

皆さんは、自動化処理の中で「ファイルを開こうとしたらエラーで止まった」「書き込み中に他のアプリに掴まれていてデータが壊れた」といった経験はありませんか?

特にVBScriptは、Windows標準で動く軽量な武器ですが、「ファイルが今、誰かに使われているかどうか」を判断する機能そのものは提供されていません。

今回は、VBScriptの泥臭いけれど確実な「排他ロック判定」の術を伝授します。ここをマスターすれば、あなたの書く自動化スクリプトは、一段上の「堅牢性」を手に入れるはずです。

なぜ「排他判定」が必要なのか?

Windows OSは、あるプログラム(Excelやメモ帳など)がファイルを開くと、そのファイルに「ロック」をかけます。これは、データの整合性を守るための大切な仕組みです。

しかし、VBScriptで何の対策もせずに `OpenTextFile` や `CopyFile` を実行すると、ロック中のファイルにぶつかった瞬間にスクリプトが「実行時エラー」を起こして停止します。

「エラーで止まる」のではなく、「今は使われているから、少し待つか、スキップしよう」と判断できるスクリプトを書くこと。 これが、プロの自動化エンジニアへの第一歩です。

核心コード:OpenTextFileの「副作用」を利用する

VBScriptには「ファイルがロックされているか?」を直接問い合わせる命令はありません。そこで、「あえて排他モードで開こうとして、エラーが出るかどうかを試す」という、逆転の発想を使います。

以下のコードは、そのための判定関数です。

Option Explicit

‘ — ファイル排他判定関数 —
‘ 戻り値: True=ロック中(使用不可), False=使用可能
Function IsFileLocked(strFilePath)
Dim fso, fileStream
Set fso = CreateObject(“Scripting.FileSystemObject”)

On Error Resume Next ‘ エラーが発生しても止めない設定

‘ 読み取り専用で開こうと試みる
‘ ロックされている場合はここでエラーが発生する
Set fileStream = fso.OpenTextFile(strFilePath, 1, False)

If Err.Number <> 0 Then
‘ エラーが発生した = ロックされている
IsFileLocked = True
Err.Clear
Else
‘ 正常に開けた = ロックされていない
IsFileLocked = False
fileStream.Close
End If

On Error GoTo 0 ‘ エラー監視を元に戻す(重要!)
Set fso = Nothing
End Function

‘ — 実行例 —
Dim targetFile
targetFile = “C:\Temp\TestReport.xlsx”

If IsFileLocked(targetFile) Then
WScript.Echo “警告: ファイル [” & targetFile & “] は現在使用中です。処理をスキップします。”
Else
WScript.Echo “成功: ファイルは使用可能です。処理を開始します。”
‘ ここに本来の処理を書く
End If

このコードの「賢いポイント」

1. `On Error Resume Next` の活用
通常、エラーが発生するとスクリプトは強制終了します。この命令を使うことで「エラーをキャッチし、自分で何とかする」というモードに切り替えています。
2. `Err.Number` の監視
`Err.Number` が 0 であれば正常、それ以外であれば何らかの異常(=今回はファイルロック)と判定します。
3. `On Error GoTo 0` で閉じる
エラー監視のモードを解除するのは、エンジニアとしてのマナーです。これを忘れると、予期せぬ場所でエラーが起きても無視されてしまい、バグの温床になります。

初学者が陥りやすい「罠」

このコードを書く際、以下の点に注意してください。

  • 「共有違反」以外のエラーも拾ってしまう

上記関数は「ファイルが存在しない場合」や「アクセス権がない場合」も `IsFileLocked = True` を返します。より厳密にするなら、`Err.Number` の中身(70番:書き込み禁止など)を詳細にチェックするロジックを加えると完璧です。

  • ファイルオブジェクトの後始末

`Set fso = Nothing` を忘れないでください。大規模なループ処理の中でこれを繰り返すと、メモリリークの原因となります。

  • タイムラグの考慮

「判定した瞬間に空いていて、処理を開始した瞬間に誰かが開く」という可能性はゼロではありません。重要な書き込み処理の前には、必ずエラーハンドリング(`On Error Resume Next`)を併用することを推奨します。

終わりに:自動化は「疑う」ことから始まる

プログラミングの世界では「うまく動くコード」を書くことよりも、「失敗した時にどう振る舞うか」を設計することの方が、遥かに重要です。

この排他判定関数は、あなたの自動化ツールを「動けばいいもの」から「安心して放置できるもの」へと変えてくれるはずです。

「このファイル、今使われていないかな?」と疑う慎重さを持ち、ぜひ現場の自動化で活用してみてください。ここをクリアできれば、VBScriptの基礎はもうバッチリですよ!

また分からないことがあれば、いつでも聞きに来てくださいね。応援しています。

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