WindowsのTempファイルを自動で消去

医療系の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
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次