AutoCADバッチ処理の「死の淵」を回避せよ:Tempファイル監視による堅牢な自動クリーンアップ術
大規模な図面バッチ処理を組んでいるとき、最も恐ろしいのは「実行開始から数時間後に訪れる、ディスク容量不足による強制終了」です。数千枚の図面を開閉し、Undoログや一時ファイルがストレージを食いつぶす様子をただ見守る……そんな非効率な設計は、今日で卒業しましょう。
今回は、`AcadApplication.Preferences.Files.TempFilePath`を起点に、AutoCADが残した「負の遺産」を自ら制御下に置く、実務レベルのクリーンアップ設計を伝授します。
—
1. なぜ「AutoCAD任せ」ではいけないのか
AutoCADは優秀なCADですが、バッチ処理におけるメモリ管理とファイルI/Oの挙動は、時に暴走します。特に`TempFilePath`に吐き出される`.ac$`, `.bak`, `.dwl`といったファイル群は、プロセス終了時に自動削除される設計にはなっていますが、「異常終了」や「極端な高負荷」の条件下では、平気でゴミとして居座り続けます。
これを放置すると、OSのディスク容量を圧迫するだけでなく、ファイルシステム上のエントリ数が増加し、OS自体のパフォーマンスも低下します。プロのツール開発者であれば、「自身のプロセスが散らかしたゴミは、自身の責任で掃除する」という作法をコードに組み込むべきです。
—
2. 実装の要諦:監視とクリーンアップの設計
単にファイルを削除するだけでは不十分です。以下の3つの鉄則を守ってください。
1. 排他制御の徹底: AutoCADが現在書き込み中のファイルに触れてはならない。
2. 実行コンテキストの分離: メインのバッチ処理と掃除処理を分離し、処理のオーバーヘッドを最小化する。
3. 安全な削除ロジック: 削除対象のファイルが本当に不要なものか、拡張子とタイムスタンプで厳密に評価する。
—
3. 実装コード:AutoCAD Temp Cleaner
以下は、`AcadApplication`から一時フォルダパスを取得し、安全にクリーンアップを行うプロシージャです。これをバッチ処理の各図面間、あるいは一定のサイクルで呼び出してください。
Option Explicit
‘ — 業務自動化のための堅牢なTempクリーンアップツール —
‘ 注意: このコードは自己責任で運用してください。削除対象は自己判断で調整すること。
Public Sub CleanupAutoCADTempFiles()
Dim acadPref As AcadPreferencesFiles
Dim tempPath As String
Dim fso As Object
Dim folder As Object
Dim file As Object
‘ 1. 現在のAutoCAD一時フォルダパスを取得
Set acadPref = ThisDrawing.Application.Preferences.Files
tempPath = acadPref.TempFilePath
Set fso = CreateObject(“Scripting.FileSystemObject”)
‘ フォルダが存在しない場合のガード節
If Not fso.FolderExists(tempPath) Then Exit Sub
Set folder = fso.GetFolder(tempPath)
‘ 2. 各ファイルを走査
For Each file In folder.Files
On Error Resume Next ‘ ファイルロックによるエラーを無視して続行
‘ 拡張子によるフィルタリング(重要: 不要なファイルのみ削除)
Select Case LCase(fso.GetExtensionName(file.Name))
Case “ac$”, “bak”, “dwl”, “dwl2”
‘ 最後に更新されてから1時間経過しているもののみ削除(安全策)
If DateDiff(“n”, file.DateLastModified, Now) > 60 Then
file.Delete True
End If
End Select
On Error GoTo 0
Next file
Debug.Print “Tempクリーンアップ完了: ” & tempPath
End Sub
—
4. プロの視点:開発者へのアドバイス
なぜ「1時間の猶予」を設けるのか
バッチ処理中に「今まさにAutoCADが使っているファイル」を削除しようとすると、アクセス拒否エラーや、最悪の場合プロセスがクラッシュします。`DateLastModified`を確認し、一定時間更新がない「完全に死んでいる一時ファイル」のみを狙い撃つのが、システムを安定させるコツです。
パフォーマンスへの配慮
この処理を1図面ごとに実行するのはオーバースペックです。`10図面処理するごとに1回`、あるいは`処理時間が30分を超えたら実行`するなど、カウンター変数を設けて実行間隔を制御してください。
さらに先のステージへ
もし、AutoCADのバッチ処理が数万枚規模に及ぶなら、VBA単体での制御には限界が来ます。その際は、`FileSystemWatcher`クラスを備えた`.NET (C#)`へ移行し、バックグラウンドスレッドで監視を走らせるアーキテクチャを検討してください。
—
まとめ:技術は「守り」があってこそ輝く
どんなに高度な図面変換ロジックを書いても、ディスク容量不足で止まるツールは「欠陥品」です。環境を整え、インフラの安定を自ら設計する――。それこそが、ただのプログラマーと、真のエンジニアを分かつ境界線です。
あなたの自動化ツールに、この「守りの知見」を組み込んでください。それが、大規模開発を成功させる唯一の道です。
