VisualStudioプロジェクトの一時ファイル（.ipchや.pch）を簡単に削除する方法

該当するディレクトリを選ぶとそれ以降すべての子階層まで一時ファイルを探して消してくれるスクリプトを作りました。


```python
import os
import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox

def calculate_delete_size(directory):
    """指定されたディレクトリとそのサブディレクトリから.ipchと.pchファイルの合計サイズを計算し、削除対象のファイルリストを返す"""
    total_size = 0
    files_to_delete = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(('.ipch', '.pch')):
                file_path = os.path.join(root, file)
                try:
                    file_size = os.path.getsize(file_path)
                    files_to_delete.append((file_path, file_size))
                    total_size += file_size
                except Exception as e:
                    print(f"Error accessing {file_path}: {e}")
    return total_size, files_to_delete

def confirm_and_delete(files_to_delete, total_size):
    """ユーザーに削除確認をし、承認された場合にファイルを削除"""
    if files_to_delete:
        size_in_mb = total_size / (1024*1024)
        response = messagebox.askyesno("削除確認",
                                       f"合計 {len(files_to_delete)} 個のファイル、約 {size_in_mb:.2f} MBを削除します。続行しますか？")
        if response:
            for file_path, file_size in files_to_delete:
                try:
                    os.remove(file_path)
                    print(f"Deleted: {file_path}")
                except Exception as e:
                    print(f"Error deleting {file_path}: {e}")
            messagebox.showinfo("削除完了", f"合計 {size_in_mb:.2f} MBの容量が節約されました。")
        else:
            messagebox.showinfo("削除キャンセル", "ファイル削除はキャンセルされました。")
    else:
        messagebox.showinfo("ファイルなし", "削除するファイルが見つかりませんでした。")

def select_directory():
    """ディレクトリを選択し、選択したディレクトリで.ipchと.pchファイルを削除するプロセスを開始"""
    root = tk.Tk()
    root.withdraw()  # メインウィンドウを隠す
    directory = filedialog.askdirectory()  # ディレクトリ選択ダイアログを表示
    if directory:  # ディレクトリが選択された場合
        total_size, files_to_delete = calculate_delete_size(directory)
        confirm_and_delete(files_to_delete, total_size)
    else:
        messagebox.showinfo("選択キャンセル", "操作がキャンセルされました。")

if __name__ == '__main__':
    select_directory()

```


---


このPythonスクリプトは、ユーザーがGUI（グラフィカルユーザーインターフェース）を介して特定のディレクトリを選択し、そのディレクトリおよびそのサブディレクトリから特定のファイルタイプ（`.ipch` と `.pch`）を見つけ出し、それらのファイルを削除する機能を提供します。ここで使われている各関数の役割とプロセスの流れを解説します：

### 1. `calculate_delete_size(directory)`
この関数は、指定されたディレクトリ内およびそのサブディレクトリ内から `.ipch` と `.pch` ファイルを探し出し、これらのファイルの合計サイズを計算します。各ファイルのパスとサイズは `files_to_delete` リストに追加され、関数はファイルの合計サイズとこのリストを返します。

- `os.walk(directory)`: このメソッドはディレクトリツリーをトップダウンで走査し、各ディレクトリのroot（ディレクトリパス）、dirs（サブディレクトリのリスト）、files（ファイルのリスト）を返します。
- `file.endswith(('.ipch', '.pch'))`: ファイル名が指定された拡張子で終わるかどうかをチェックします。
- `os.path.getsize(file_path)`: ファイルのサイズを取得します。

### 2. `confirm_and_delete(files_to_delete, total_size)`
この関数は、ユーザーにファイル削除を確認させ、承認された場合にのみファイルを削除します。削除するファイルの総数とその合計サイズがダイアログボックスに表示され、ユーザーが「Yes」をクリックした場合に削除が進行します。

- `messagebox.askyesno()`: ユーザーにYes/Noで答える確認ダイアログを表示します。
- `os.remove(file_path)`: ファイルを削除します。

### 3. `select_directory()`
この関数は、tkinterを使用してファイル選択ダイアログを表示し、ユーザーがディレクトリを選択できるようにします。ディレクトリが選択されたら、`calculate_delete_size()` でファイルサイズを計算し、`confirm_and_delete()` で削除プロセスを進行します。

- `filedialog.askdirectory()`: ディレクトリ選択ダイアログを表示します。
- `root.withdraw()`: tkinterのメインウィンドウを隠します。

### 実行
スクリプトが直接実行される場合（`if __name__ == '__main__':`）、`select_directory()` 関数が呼び出され、全プロセスが開始されます。

このスクリプトはファイル操作においてユーザーの介入を必要とするため、間違ったファイルの誤削除を防ぐためのセーフガードを提供しています。

---


Windowsなら以下の「Get-ChildItem」を使った方法もいいなとスクリプトを作ったあとで気づきました。
https://suzulang.com/visual-cpp-delete-useless-files-powershell/