【入門編】【一時ファイル管理】FileSystemObject による安全なユニーク一時ファイル(Temp)作成と確実な自動クリーンアップ – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

VBScriptを「使い捨てない」技術:安全な一時ファイル管理の極意

こんにちは。VBScriptの世界へようこそ。
「マクロの記録」で生成されたコードを眺める段階を卒業し、いよいよ自分の力でシステムを制御しようとしているあなたへ。

VBScriptで最も多くの初心者が躓き、そして最も多くの「ゴミ」をシステムに残してしまうのが「一時ファイル(Tempファイル)の扱い」です。

いいですか、一時ファイルは「使ったら消す」のが礼儀ではありません。「いかなる状況でも必ず消えるように設計する」のが、プロのエンジニアの流儀です。今回は、FileSystemObject(FSO)を使いこなし、システムを汚さないための「極限の安全パターン」を伝授します。

1. なぜ「一時ファイル」の管理が重要なのか?

プログラムが途中でエラーを起こして停止したとき、作成した一時ファイルが放置される……そんな経験はありませんか? 放置されたファイルは、次の実行時に「同名ファイルが存在します」というエラーを誘発したり、ディスク容量を圧迫する「見えない負債」になります。

VBScriptには自動メモリ管理機能(ガベージコレクション)はありますが、ファイルシステム上のリソースまでは自動で片付けてくれません。 ここを制御できるかどうかが、あなたのコードの信頼性を決定づけます。

2. 【核心】安全な一時ファイルの生成とクリーンアップ

まずは、最も安全で、かつ現場でそのまま使える「鉄板テンプレート」を見てください。

Option Explicit

‘ メイン処理を実行する関数
Sub Main()
Dim fso, tf, tempPath
Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ 1. システムの一時フォルダパスを取得 (2 = TemporaryFolder)
tempPath = fso.GetSpecialFolder(2).Path

‘ 2. ユニークな一時ファイル名を生成
‘ GetTempNameは、他プロセスと衝突しないランダムな名前を生成します
Dim tmpFileName
tmpFileName = fso.BuildPath(tempPath, fso.GetTempName())

‘ エラーハンドリングの準備(ここが肝!)
On Error Resume Next

‘ 一時ファイルを作成(TextStreamオブジェクト)
Set tf = fso.CreateTextFile(tmpFileName, True)

‘ — ここで実際の処理を行う —
tf.WriteLine “VBScriptの真髄をここに記す。”
‘ —————————

‘ エラー発生の有無にかかわらず、終了処理へ
If Err.Number <> 0 Then
WScript.Echo “エラー発生: ” & Err.Description
End If

‘ 3. 確実なクリーンアップ
‘ ファイルを閉じて、オブジェクトを解放し、ファイルを削除する
If Not tf Is Nothing Then tf.Close
If fso.FileExists(tmpFileName) Then fso.DeleteFile tmpFileName, True

Set tf = Nothing
Set fso = Nothing
End Sub

‘ 処理開始
Call Main()

3. コードの「裏側」を読み解く

このコードには、現場で生き残るための3つの知恵が詰まっています。

① `GetSpecialFolder(2)` の賢い使い方

固定で `C:\Temp` と書くのはNGです。環境によって一時フォルダの場所は異なります。`GetSpecialFolder(2)` を使えば、OSが管理する正しい一時フォルダを自動的に特定してくれます。

② `GetTempName` で衝突を避ける

複数のバッチを同時に動かす場合、ファイル名が固定だと「取り合い」になります。`GetTempName` は、システムが現在利用していないランダムな名前を生成してくれるため、マルチプロセス環境でも安全です。

③ `On Error Resume Next` とクリーンアップの共存

VBScriptには `Try…Finally` 構文がありません。そのため、エラーが発生してもプログラムを止めずに「終了処理(クリーンアップ)」まで到達させるために `On Error Resume Next` を活用します。これが「掃除を忘れない」ための生命線です。

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

  • 「とりあえず消さなくていいや」という油断:

一時ファイルは、実行回数分だけ増殖します。1日10回実行すれば、1ヶ月で300個のゴミが溜まります。これがシステムの遅延や思わぬ障害の温床になります。

  • ファイルが開いたまま削除しようとする:

`tf.Close` を忘れると、OSがファイルをロックしたままになり、`fso.DeleteFile` で「権限がありません」というエラーが出ます。必ず `Close` してから削除してください。

先輩エンジニアからのメッセージ

VBScriptは古い言語だと言われることもありますが、Windows環境においてこれほど軽量で、OSの深部にまでアクセスできる言語は他にありません。

今回学んだ「生成したものは必ず片付ける」という考え方は、VBScriptだけでなく、Pythonでも、C#でも、どんな言語を使うようになっても一生使える「エンジニアの素養」です。

まずはこのコードをコピペして、自分のPCで動かしてみてください。そして、エラーを出してあえて「クリーンアップが動くか」をテストしてみてください。そこからが、あなたの本当のエンジニアリングの始まりですよ!

また何か詰まったら、いつでも聞きに来てくださいね。応援しています。

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