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

スポンサーリンク

AutoCADの「静かなる死」を防ぐ:一時ファイル肥大化を制するアーキテクチャ

AutoCADのバッチ処理において、最も恐ろしいのは「システムエラーによる強制終了」ではない。「ディスクI/Oの飽和と一時ファイルによるドライブの完全停止」だ。

数千枚の図面を自動処理する際、`.ac$`, `.bak`, `.sv$` といったゴミが生成され、OSのファイルハンドルを食いつぶす。AutoCADの`Preferences.Files.TempFilePath`を参照するだけでは足りない。我々エンジニアが管理すべきは、AutoCADのライフサイクルから漏れ出した「ゾンビファイル」の残滓である。

今日は、VBAからOSの深淵を制御し、図面処理の安定性を極限まで高めるための実装論を説く。

—

1. 勘違いの罠:なぜVBAの標準機能だけでは足りないのか

AutoCADのVBAモデルは、`AcadApplication.Preferences.Files.TempFilePath`で一時フォルダのパスを取得できる。しかし、このプロパティは「現在どこを見ているか」を示すに過ぎず、ファイルシステムのクリーンアップを代行してはくれない。

特に、バッチ処理中にAutoCADがクラッシュした場合、VBAの `On Error` ブロックすら実行されず、大量のロックファイルが放置される。これを防ぐには、VBAから直接 FileSystemObject (FSO) を制御し、かつ、オープン状態のファイルを避けるための排他制御を実装する必要がある。

2. 【核心】一時ファイルクリーンアップ・アーキテクチャ

以下のコードは、単なる削除ルーチンではない。OSレベルで「現在使用中のファイル」をスキップし、安全なものだけをパージする堅牢な構造を持っている。

Option Explicit

‘ 伝説的な安定性を実現するクリーンアップルーチン
Public Sub PurgeAutoCADTempFiles()
Dim fso As Object
Dim tempFolder As Object
Dim fileItem As Object
Dim tempPath As String

‘ AutoCADから現在のテンポラリパスを取得
tempPath = ThisDrawing.Application.Preferences.Files.TempFilePath

Set fso = CreateObject(“Scripting.FileSystemObject”)

‘ フォルダが存在しない場合の防護壁
If Not fso.FolderExists(tempPath) Then Exit Sub
Set tempFolder = fso.GetFolder(tempPath)

On Error Resume Next ‘ ファイルロックによる例外を黙殺する極めて実戦的な手法
For Each fileItem In tempFolder.Files
‘ .ac$, .bak, .sv$ 等の不要な残骸をターゲットにする
If LCase(fso.GetExtensionName(fileItem.Name)) Like “ac$” Or _
LCase(fso.GetExtensionName(fileItem.Name)) Like “bak” Or _
LCase(fso.GetExtensionName(fileItem.Name)) Like “sv$” Then

fileItem.Delete True
End If
Next fileItem
On Error GoTo 0

‘ メモリ最適化:明示的解放はVBAの作法
Set fileItem = Nothing
Set tempFolder = Nothing
Set fso = Nothing
End Sub

3. チーフアーキテクトからの助言:メモリとライフサイクル

VBAにおける最大の悪習は、オブジェクトの「放置」である。
`Set fso = Nothing` を省略するエンジニアを私は信用しない。AutoCADのCOMインターフェースは、プロセスの寿命が長引くほどメモリリークを誘発しやすい。

  • スコープの最小化: 処理は必ず独立した `Sub` に分割し、関数終了時にメモリを解放すること。
  • Windows APIの併用: もし、数万ファイルを超えるような極限の環境なら、`SHFileOperation` API(シェル関数)を呼び出し、削除プロセスをOS側に委譲すべきだ。これにより、VBAのメインスレッドを停止させずにクリーンアップが可能となる。

4. システム間連携における「死活監視」

大規模なバッチ処理を行う場合、このクリーンアップ関数を「メインルーチンの開始直前」と「50図面ごとのインターバル」に挟み込む。

‘ 実行例
Public Sub BatchProcessing()
Dim i As Long
For i = 1 To 1000
‘ 図面処理実行
ProcessDrawing(i)

‘ 50枚ごとにクリーンアップをトリガー
If i Mod 50 = 0 Then
PurgeAutoCADTempFiles
End If
Next i
End Sub

最後に:エンジニアとしての矜持

AutoCAD VBAは、現代の言語から見れば「化石」に近いかもしれない。しかし、その化石を操作して巨大な建築物やプラントの図面を自動制御するのは、我々のような職人にしかできない芸当だ。

システムがクラッシュするのは、コードが未熟なのではなく、「環境の管理」を怠ったからだ。 テンポラリファイルをただのゴミと見るか、システム崩壊のトリガーと見るか。その視座の差が、プロフェッショナルとアマチュアを分かつ。

現場の安定は、こうした泥臭いメンテナンスの積み重ねの上にある。諸君のコードが、今日も無事にタスクを完遂することを祈っている。

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