医療系の3Dソフトを動かすとWindow/Temp/にcab***溜まり、ディスク容量を圧迫する。メーカーでサポートすると思っていたが、一向に改善しないので「Python」を使い、消去するプログラムを作ってみた。
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import os
import glob
class TempFileDeleterApp:
def __init__(self, root):
self.root = root
self.root.title("Windows Temp ファイルクリーナー By info-search.info")
self.root.geometry("600x450")
# 操作対象のディレクトリ
self.target_dir = "C:/Windows/Temp"
# --- ウィジェットの作成 ---
# メインフレーム
main_frame = ttk.Frame(self.root, padding="10")
main_frame.pack(fill=tk.BOTH, expand=True)
# 1. 入力と検索部分のフレーム
top_frame = ttk.Frame(main_frame)
top_frame.pack(fill=tk.X, pady=5)
ttk.Label(top_frame, text="ファイルパターン (例: *.tmp, *.log):").pack(side=tk.LEFT, padx=(0, 5))
self.pattern_var = tk.StringVar(value="cab*")
self.pattern_entry = ttk.Entry(top_frame, textvariable=self.pattern_var, width=20)
self.pattern_entry.pack(side=tk.LEFT, expand=True, fill=tk.X)
self.search_button = ttk.Button(top_frame, text="ファイル検索", command=self.search_files)
self.search_button.pack(side=tk.LEFT, padx=(5, 0))
# 2. ファイルリスト部分のフレーム
list_frame = ttk.Frame(main_frame)
list_frame.pack(fill=tk.BOTH, expand=True, pady=5)
# ListboxとScrollbar
self.file_listbox = tk.Listbox(list_frame, selectmode=tk.EXTENDED, height=15)
self.scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, command=self.file_listbox.yview)
self.file_listbox.config(yscrollcommand=self.scrollbar.set)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.file_listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# 3. 削除ボタン
self.delete_button = ttk.Button(main_frame, text="選択したファイルを削除", command=self.delete_selected_files)
self.delete_button.pack(fill=tk.X, pady=5)
# 4. ステータスバー
self.status_var = tk.StringVar(value=f"準備完了。対象フォルダ: {self.target_dir}")
self.status_label = ttk.Label(self.root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W, padding=5)
self.status_label.pack(side=tk.BOTTOM, fill=tk.X)
# 初期検索を実行
self.search_files()
def search_files(self):
"""指定されたパターンのファイルを検索してリストボックスに表示する"""
pattern = self.pattern_var.get()
if not pattern:
self.status_var.set("エラー: ファイルパターンを入力してください。")
return
# リストボックスをクリア
self.file_listbox.delete(0, tk.END)
search_path = os.path.join(self.target_dir, pattern)
try:
# globでファイルリストを取得
files = glob.glob(search_path)
# ファイルのみをリストアップ(ディレクトリは除外)
self.found_files = [f for f in files if os.path.isfile(f)]
if not self.found_files:
self.status_var.set(f"パターン '{pattern}' に一致するファイルは見つかりませんでした。")
return
for file_path in self.found_files:
# リストボックスにはファイル名のみ表示
self.file_listbox.insert(tk.END, os.path.basename(file_path))
self.file_listbox.select_set(0, tk.END)
self.status_var.set(f"{len(self.found_files)} 個のファイルが見つかりました。")
except PermissionError:
self.status_var.set("エラー: フォルダへのアクセス権がありません。管理者として実行してください。")
messagebox.showerror("権限エラー", f"{self.target_dir} へのアクセスが拒否されました。\n管理者としてスクリプトを再実行してください。")
except Exception as e:
self.status_var.set(f"エラーが発生しました: {e}")
messagebox.showerror("エラー", f"ファイルの検索中にエラーが発生しました:\n{e}")
def delete_selected_files(self):
"""リストボックスで選択されたファイルを削除する"""
selected_indices = self.file_listbox.curselection()
if not selected_indices:
self.status_var.set("ファイルが選択されていません。")
messagebox.showinfo("情報", "削除するファイルをリストから選択してください。")
return
# 削除するファイル名のリストを作成
files_to_delete_basenames = [self.file_listbox.get(i) for i in selected_indices]
# 確認メッセージ
confirm = messagebox.askyesno(
"削除の確認",
f"{len(files_to_delete_basenames)} 個のファイルを選択しました。\n"
f"本当に削除しますか?\n\nこの操作は元に戻せません。"
)
if not confirm:
self.status_var.set("削除はキャンセルされました。")
return
success_count = 0
fail_count = 0
for basename in files_to_delete_basenames:
file_path = os.path.join(self.target_dir, basename)
try:
os.remove(file_path)
success_count += 1
except PermissionError:
# ファイルが使用中の場合など
fail_count += 1
print(f"権限エラー: {file_path} は削除できませんでした(使用中の可能性があります)。")
except FileNotFoundError:
# すでに存在しない場合
fail_count += 1
print(f"ファイルなし: {file_path} は見つかりませんでした。")
except Exception as e:
fail_count += 1
print(f"エラー: {file_path} の削除中にエラーが発生しました: {e}")
# 結果をステータスバーに表示
result_message = f"削除完了: {success_count}個成功, {fail_count}個失敗。"
self.status_var.set(result_message)
messagebox.showinfo("削除結果", result_message)
# ファイルリストを更新
self.search_files()
if __name__ == "__main__":
# 管理者権限のチェック(簡易的)
try:
# Windows専用
is_admin = (os.getuid() == 0)
except AttributeError:
# Windows以外の場合 or ctypesがない場合
import ctypes
is_admin = ctypes.windll.shell32.IsUserAnAdmin() != 0
if not is_admin:
messagebox.showwarning("警告", "管理者権限がありません。\nC:/Windows/Temp/ 内のファイルを削除できない可能性があります。\n管理者として再実行することをお勧めします。")
root = tk.Tk()
app = TempFileDeleterApp(root)
root.mainloop()
PyinstallerでEXE化、このEXEファイルは下記のリンクからダウンロードできます。
不要だけど状況によっては必要になるかも Visual C++ 再頒布可能パッケージの vc_redist.x64 .exe(64Bit)かvc_redist.x86 .exe(32Bit)
無ければここから https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170 ダウンロードしてインストール。
Windows10では動作するもののサポートが切れたWindows7では動作は無理でした。Windows7用はBATファイルで対応しています。医療系はクローズドシステムでローカル環境が多い事や、プログラムやサーバー機が高額なため一部ではWindows7を使っている事が多い。
以下BAT(バッチ)バッチファイルで保存はSHIFT-JISで行ってください。
PCにはキーボードを付けてないので”Y/N”の確認は省いて一発消去になっています。
@echo off
echo C:\Windows\Temp フォルダ内の cab** ファイルを削除します...
echo.
rem 削除コマンドの実行
rem /f: 読み取り専用ファイルも強制的に削除
rem /q: 確認メッセージを表示しないサイレントモード
del /f /q C:\Windows\Temp\cab*
echo.
echo 処理が完了しました。
echo.
pause