27 Ekim 2026 Salı

50〜100GBを安全に解放:.NET・ゲーム・デスクトップ開発者のためのディスククリーンアップ完全ガイド




50〜100GBを安全に解放:.NET・ゲーム・デスクトップ開発者のためのディスククリーンアップ完全ガイド

Windows環境で開発を行うすべてのエンジニアにとって、ある日突然訪れる悪夢があります。作業を開始しようとPCを起動すると、1TBのNVMe SSDの空き容量が残り2GB未満になり、警告が表示される現象です。

大容量の動画をダウンロードしたわけでも、新しい大作ゲームをインストールしたわけでもありません。一体どこへ容量が消えたのでしょうか?

.NET 8/9、MonoGame、Android、そしてMicrosoft Store向けパッケージング(MSIX/WAP)を扱うインディーゲーム兼デスクトップ開発者として調査した結果、プロジェクトリポジトリ内に68GB以上もの不要なビルド成果物やパッケージキャッシュが蓄積していることが判明しました。

本記事では、開発環境が肥大化する構造的な理由、これらを削除しても100%安全である根拠、そしてワンクリックで数十GBを取り戻せるPowerShell/Batchスクリプトを共有します。


1. 開発環境のディスク肥大化の構造

クロスプラットフォーム対応のソリューションをコンパイルする際、ビルドツールチェーンは各工程で中間バイナリやアセットを複製します。

flowchart TD
    subgraph "プロジェクトワークスペース"
        Code["ソースコード (.cs, .xaml, .json)\n(保護対象 - 数MB)"]
        Assets["元アセット (PNG, OGG, Shader)\n(保護対象)"]
        Git[".git 履歴\n(保護対象)"]
        
        BinObj["bin & obj フォルダ\n(中間DLL、シンボル、複製)\n[30 - 60 GB]"]
        AppPackages["WAP / MSIX AppPackages\n(過去の .msixbundle, .msixupload)\n[5 - 20 GB]"]
    end

    subgraph "システム&グローバルキャッシュ"
        NuGet["%USERPROFILE%\\.nuget\\packages\n(グローバルNuGetキャッシュ)\n[10 - 20 GB]"]
        Temp["%LOCALAPPDATA%\\Temp\n(コンパイラ一時ファイル)\n[3 - 10 GB]"]
    end

    style BinObj fill:#ff6b6b,stroke:#c92a2a,stroke-width:2px,color:#fff
    style AppPackages fill:#ff6b6b,stroke:#c92a2a,stroke-width:2px,color:#fff
    style NuGet fill:#ff922b,stroke:#d9480f,stroke-width:2px,color:#fff
    style Temp fill:#ff922b,stroke:#d9480f,stroke-width:2px,color:#fff

原因1:bin と obj フォルダ(30〜60GB以上)

  • obj/(中間出力): 差分コンパイル情報やプラットフォーム固有の中間ファイルを保持します。Androidターゲットの場合、1プロジェクトだけで3〜6GBに達することがあります。
  • bin/(バイナリ出力): 実行ファイルおよび <CopyToOutputDirectory> で複製されたアセットを格納します。10個のプロジェクトが500MBの共通ゲームコンテンツを参照していると、合計5GBが重複消費されます。

原因2:Microsoft Store の AppPackages(5〜20GB以上)

ストア配信用にパッケージを作成するたびに、.msixbundle やデバッグシンボル(PDB)を含む .msixupload が生成されます。Visual Studioは過去のバージョンを自動削除しないため、蓄積し続けます。

原因3:NuGet グローバルキャッシュ(10〜20GB以上)

%USERPROFILE%\.nuget\packages には、過去にダウンロードされたすべてのバージョンが保持されます。

原因4:Windows Temp フォルダ(3〜10GB)

コンパイルやパッケージ圧縮時に %LOCALAPPDATA%\Temp に展開された作業ファイル群です。


2. 安全性の保証:なぜ100%リスクがないのか?

保護される対象(絶対に削除されません) 安全に削除できる対象(完全に再生成可能)
ソースコード: .cs, .xaml, .cpp, .json など コンパイラ中間オブジェクト (obj/)
プロジェクト設定: .sln, .csproj, .wapproj コンパイル済みバイナリ (bin/)
Gitリポジトリ: .git/ フォルダ、履歴、ブランチ 過去のストア配信用パッケージ (AppPackages/)
元アセット: 画像、音声、シェーダー キャッシュされたNuGetパッケージ (.nuget\packages)
証明書: .pfx, StoreAssociation.xml Windows一時ファイル (%LOCALAPPDATA%\Temp)

Visual Studioを再起動したらどうなる?
ソリューションを開いて ビルド (Build) または リビルド (Rebuild) を実行するだけで、ソースコードから最新の bin と obj が自動生成されます。Gitのコミット履歴やソースコードは一切影響を受けません。


3. 自動化スクリプト:ワンクリックで安全に削除

PowerShell スクリプト本体 (_tools/Clean-DevDiskSpace.ps1)

<#
.SYNOPSIS
    開発者向けディスク容量クリーンアップツール
#>
[CmdletBinding()]
param (
    [switch]$Force,
    [switch]$ScanOnly,
    [switch]$SkipNuget,
    [switch]$SkipTemp,
    [string]$RootPath = ""
)

if ([string]::IsNullOrWhiteSpace($RootPath)) {
    if ($PSScriptRoot) { $RootPath = (Join-Path $PSScriptRoot "..") } else { $RootPath = Get-Location }
}
$resolvedRoot = (Resolve-Path $RootPath -ErrorAction SilentlyContinue).Path

if ([string]::IsNullOrWhiteSpace($resolvedRoot) -or $resolvedRoot -in @("C:\", "C:", "\", "/")) {
    Write-Host "安全保護エラー:ルートドライブが指定されたため処理を中断しました。" -ForegroundColor Red
    exit 1
}

$systemDrive = Get-PSDrive -Name C
$freeGBBefore = [math]::Round($systemDrive.Free / 1GB, 2)
Write-Host "現在のCドライブ空き容量: $freeGBBefore GB" -ForegroundColor Yellow

$binObjDirs = Get-ChildItem -Path $resolvedRoot -Recurse -Directory -Force -ErrorAction SilentlyContinue |
              Where-Object { $_.Name -in @('bin', 'obj') }
$appPackageDirs = Get-ChildItem -Path $resolvedRoot -Recurse -Directory -Filter "AppPackages" -Force -ErrorAction SilentlyContinue

if ($ScanOnly) { Write-Host "スキャン完了。" -ForegroundColor Yellow; return }
if (-not $Force) {
    $prompt = Read-Host "削除を実行しますか? (Y/N)"
    if ($prompt -notin @('Y', 'y')) { return }
}

$binObjDirs | ForEach-Object { try { Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue } catch {} }
$appPackageDirs | ForEach-Object { try { Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue } catch {} }
if (-not $SkipTemp) { Get-ChildItem -Path [System.IO.Path]::GetTempPath() -Force -ErrorAction SilentlyContinue | ForEach-Object { try { Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue } catch {} } }
if (-not $SkipNuget) { try { $null = dotnet nuget locals all --clear 2>&1 } catch {} }

$freeGBAfter = [math]::Round((Get-PSDrive -Name C).Free / 1GB, 2)
$freedTotal = [math]::Round($freeGBAfter - $freeGBBefore, 2)
Write-Host "`nクリーンアップ完了! 解放容量: +$freedTotal GB" -ForegroundColor Green

バッチファイル起動ランチャー (clean-disk-space.bat)

@echo off
setlocal
title Workspace Disk Cleanup
cd /d "%~dp0"
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0_tools\Clean-DevDiskSpace.ps1" %*
pause

4. 実際の検証結果:1.35GBから53.80GBへ

  • 実行前空き容量: 1.35 GB(警告状態)
  • 実行後空き容量: 53.80 GB
  • 回復した容量: +52.45 GB(所要時間:約3分)

開発効率を維持するためにも、定期的なクリーンアップをおすすめします。


Arar Games と作品のご紹介

インディーゲーム作品とスタジオ公式リンク:

🎮 ゲーム作品

  • Blocked: Pixel Panzer: ダイナミックな天候と巨大ボス戦が楽しめるレトロ戦車アーケードバトル。
    Google Play (Android & PC)
  • PaintTrek: 鮮やかな色彩のパズルとピクセルペイントアクション。
    Google Play | Microsoft Store (PC & Xbox)
  • Space Dodger: 反射神経が試される超高速レトロ宇宙障害物回避ゲーム。
    Google Play

📱 公式SNSアカウント




Hiç yorum yok:

Yorum Gönder