【実務・中級編】【実務中級】AcadApplication.Preferences.Files.TempFilePathの監視:マクロ実行中に肥大化する一時ファイルの自動クリーンアップ – AutoCAD VBA解析バイブル

スポンサーリンク

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#)`へ移行し、バックグラウンドスレッドで監視を走らせるアーキテクチャを検討してください。

—

まとめ:技術は「守り」があってこそ輝く

どんなに高度な図面変換ロジックを書いても、ディスク容量不足で止まるツールは「欠陥品」です。環境を整え、インフラの安定を自ら設計する――。それこそが、ただのプログラマーと、真のエンジニアを分かつ境界線です。

あなたの自動化ツールに、この「守りの知見」を組み込んでください。それが、大規模開発を成功させる唯一の道です。

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