データの破損を防ぐ「守護神」を実装せよ:FSOによる空き容量チェックの極意
こんにちは。現場の自動化を支えるエンジニアの皆さん。
日々、VBScriptを使って「面倒な作業をボタン一つで終わらせる」仕組みを作っていることでしょう。マクロの記録から一歩踏み出し、自分でコードを書き始めた皆さんは、今まさに「道具を使う側」から「仕組みを作る側」へと進化している最中です。
しかし、ここで一つ、プロフェッショナルとしての洗礼を受けなければならない場面があります。
それは、「動くコード」と「壊れないコード」の決定的な違いです。
例えば、数GBに及ぶ巨大なバックアップファイルをコピーするスクリプトを書いたとしましょう。もし、転送先のドライブの容量が足りなかったらどうなるでしょうか?
「エラーが出て止まる」だけならまだマシです。最悪の場合、「コピーが中途半端に終わり、ファイルが破損した状態で残る」という、業務上最も避けなければならない事態を引き起こします。
今日は、そんな悲劇を未然に防ぐための「ガードロジック(事前判定)」について、FileSystemObject(FSO)の深淵に触れながら解説していきましょう。ここをクリアすれば、あなたのスクリプトは「ただの自動化」から「信頼されるシステム」へと昇華します。
1. なぜ「コピーしてから失敗」ではいけないのか?
プログラミングにおいて、エラーは「起きてから対処する」のではなく、「起きる前に予兆を察知して回避する」のが鉄則です。
ファイルコピーにおいて、容量不足は「予測可能なエラー」です。
もし、コピーを開始した後に容量不足で止まってしまうと、以下のような問題が発生します。
1. データの不整合: 転送先のファイルが壊れた状態で生成される。
2. リソースの浪費: 処理に数十分かけた後にエラーになるため、復旧に時間がかかる。
3. 二次被害: 容量不足によって、そのドライブを利用している他のシステムまで停止する。
これを防ぐために、「コピーする前に、転送先の空き容量(AvailableSpace)を計測し、コピー対象のサイズと比較する」というガードロジックが必要なのです。
2. FSOの階層構造を理解する
FSO(FileSystemObject)を操る際、オブジェクトの親子関係をイメージできるかどうかが、設計の質を左右します。
FSOの世界は、以下のような階層構造になっています。
- FileSystemObject: すべての司令塔(親)
- Drive: ドライブ単位の情報(空き容量など)
- Folder: フォルダ単位の情報(作成日時など)
- File: ファイル単位の情報(サイズ、名前など)
今回のミッションは、「Fileオブジェクトからサイズを取得」し、「Driveオブジェクトから空き容量を取得」して、その二つを戦わせることです。
3. 実践:ガードロジックを組み込んだプロ仕様のコード
それでは、実際に現場でそのまま使えるレベルのコードを見てみましょう。単に比較するだけでなく、「安全マージン(余裕)」を持たせるのがプロの流儀です。
'-------------------------------------------------------------------------------
' 題名: 安全なファイルコピー・スクリプト(容量チェック機能付き)
' 概要: コピー前に転送先の空き容量を確認し、不足していれば処理を中断する
'-------------------------------------------------------------------------------
Option Explicit
Dim fso, srcFile, destFolder, srcPath, destPath
Dim srcSize, availableSpace, safetyMargin
' --- 設定エリア ---
srcPath = "C:\Work\HugeData.zip" ' コピーしたいファイルのフルパス
destPath = "D:\Backup\" ' コピー先のフォルダパス
safetyMargin = 100 * 1024 * 1024 ' 安全マージン (100MBをバイト単位で指定)
' ------------------
Set fso = CreateObject("Scripting.FileSystemObject")
' 1. コピー元ファイルの存在確認
If Not fso.FileExists(srcPath) Then
WScript.Echo "【エラー】コピー元ファイルが見つかりません: " & srcPath
WScript.Quit
End If
' 2. コピー先フォルダの存在確認
If Not fso.FolderExists(destPath) Then
WScript.Echo "【エラー】コピー先フォルダが見つかりません: " & destPath
WScript.Quit
End If
' --- ここからがプロのガードロジック ---
' 3. ファイルサイズを取得 (Byte単位)
Set srcFile = fso.GetFile(srcPath)
srcSize = srcFile.Size
' 4. 転送先ドライブの空き容量を取得 (Byte単位)
' GetFolder().Drive を使うことで、そのフォルダが属するドライブにアクセスできる
availableSpace = fso.GetFolder(destPath).Drive.AvailableSpace
' 5. 容量判定 (空き容量 < ファイルサイズ + マージン)
If availableSpace < (srcSize + safetyMargin) Then
WScript.Echo "【警告】容量不足のため、コピーを中止します。"
WScript.Echo "必要容量(概算): " & FormatBytes(srcSize + safetyMargin)
WScript.Echo "現在の空き容量: " & FormatBytes(availableSpace)
WScript.Quit
End If
' 6. 安全が確認できたので、コピー実行
WScript.Echo "容量確認完了。コピーを開始します..."
fso.CopyFile srcPath, destPath, True ' Trueは上書き許可設定
WScript.Echo "コピーが正常に完了しました。"
' --- オブジェクトの解放 (メモリ管理の作法) ---
Set srcFile = Nothing
Set fso = Nothing
'-------------------------------------------------------------------------------
' 関数: バイト単位の数値を読みやすい形式(MB/GB)に変換する
'-------------------------------------------------------------------------------
Function FormatBytes(ByVal bytes)
Dim mb, gb
mb = bytes / (1024 * 1024)
gb = mb / 1024
If gb >= 1 Then
FormatBytes = Round(gb, 2) & " GB"
Else
FormatBytes = Round(mb, 2) & " MB"
End If
End Function
4. 伝説のエンジニアが教える「ここが落とし穴」
コードを書き終えただけでは、まだ不十分です。中級者から上級者へステップアップするために、以下の3つのポイントを脳に刻んでください。
① 「バイト単位」の罠
FSOの `Size` プロパティも `AvailableSpace` プロパティも、返ってくる値はすべて 「Byte(バイト)」 です。
人間が直感的に理解できるのは「MB」や「GB」ですが、プログラム内部では常にバイトで計算してください。比較の際に「100MB足りないからOK」と人間が思っていても、コード上で `100` と書けば、それは「100バイト」という意味になってしまいます。
② 「安全マージン」の重要性
今回のコードでは `safetyMargin` を導入しました。
なぜこれが必要か? それは、「チェックした瞬間と、実際に書き込みを開始する瞬間の間に、他のプロセスがディスク容量を消費する可能性があるから」です。
ギリギリの容量で判定を通ってしまうと、書き込みの途中で容量が尽きる「レースコンディション(競合状態)」が起こり得ます。常に100MB〜数GBの余裕を持たせるのが、堅牢な設計の秘訣です。
③ オブジェクトのライフサイクル
スクリプトの最後で `Set fso = Nothing` と記述していますね。
VBScriptはガベージコレクション(不要なメモリの自動解放)を行ってくれますが、大量のファイルをループ処理する場合などは、明示的にオブジェクトを解放しないと、メモリ使用量が膨れ上がり、パフォーマンス低下や予期せぬエラーを招くことがあります。「使い終わったら片付ける」――これはプロの基本動作です。
まとめ:守護神を携えて現場へ
いかがでしたか?
「容量をチェックする」という一見単純な処理の裏には、データの整合性を守り、システムの停止を防ぐという、エンジニアとしての深い責任が込められています。
1. 事前判定(Guard Logic)を行う
2. 安全マージン(Safety Margin)を持つ
3. 単位(Byte)とオブジェクトの管理を徹底する
この3点を守るだけで、あなたの作成するVBScriptは、現場のプロたちが安心して任せられる「信頼のツール」へと変わります。
ここをクリアすれば、VBScriptの基本はバッチリですよ。自信を持って、次の自動化に挑戦してください!
