27 Ekim 2026 Salı

Mengosongkan 50-100 GB: Panduan Lengkap Pembersihan Disk untuk Developer .NET, Game, dan Desktop

Mengosongkan 50-100 GB: Panduan Lengkap Pembersihan Disk untuk Developer .NET, Game, dan Desktop

Setiap pengembang perangkat lunak dan game di Windows pasti pernah mengalami pagi yang genting: Anda menyalakan PC, membuka IDE, dan tiba-tiba Windows memberi peringatan—SSD NVMe 1 TB Anda hanya tersisa kurang dari 2 GB ruang bebas.

Anda tidak mengunduh video berukuran besar atau memasang game baru berukuran 100 GB. Ke mana semua kapasitas penyimpanan itu menghilang?

Sebagai developer game indie dan aplikasi desktop lintas platform yang bekerja dengan .NET 8/9, MonoGame, Android, serta Windows Application Packaging (MSIX/WAP untuk Microsoft Store), saya menelusuri krisis penyimpanan ini. Melalui pemindaian otomatis pada repositori proyek, ditemukan bahwa lebih dari 68 GB dihabiskan semata-mata oleh sisa kompilasi sementara, arsip paket rilis lama, dan cache paket NuGet.

Dalam panduan ini, kami membedah alasan teknis di balik penumpukan ruang tersebut, menjelaskan mengapa menghapus folder-folder ini 100% aman, serta menyediakan skrip PowerShell dan Batch otomatis siap pakai untuk memulihkan puluhan gigabyte secara instan.


1. Anatomi Penumpukan Ruang Disk Developer

Saat mengompilasi solusi lintas platform, compiler dan alat pengemasan menduplikasi biner perantara dan aset di setiap tahapan:

flowchart TD
    subgraph "Ruang Kerja Proyek"
        Code["Kode Sumber (.cs, .xaml, .json)\n(Terlindungi - Beberapa MB)"]
        Assets["Aset Asli (PNG, OGG, Shaders)\n(Terlindungi)"]
        Git["Riwayat .git\n(Terlindungi)"]
        
        BinObj["Folder bin dan obj\n(DLL perantara, simbol, salinan)\n[30 - 60 GB]"]
        AppPackages["WAP / MSIX AppPackages\n(Paket rilis store lama)\n[5 - 20 GB]"]
    end

    subgraph "Cache Sistem & Global"
        NuGet["%USERPROFILE%\\.nuget\\packages\n(Cache Global NuGet)\n[10 - 20 GB]"]
        Temp["%LOCALAPPDATA%\\Temp\n(File sementara kompilator)\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

Penyebab A: Folder bin dan obj (30 - 60+ GB)

  • obj/ (Keluaran Perantara): Menyimpan status kompilasi inkremental. Untuk proyek Android, folder ini dapat membengkak hingga 3-6 GB per proyek.
  • bin/ (Keluaran Biner): Berisi file eksekusi dan semua aset yang disalin melalui <CopyToOutputDirectory>. Jika 10 proyek mereferensikan folder konten game 500 MB yang sama, aset tersebut digandakan 10 kali (menghamburkan 5 GB).

Penyebab B: Folder AppPackages Microsoft Store (5 - 20+ GB)

Setiap kali membuat paket rilis, Visual Studio menghasilkan file .msixbundle dan .msixupload (lengkap dengan simbol PDB). Visual Studio tidak pernah menghapus versi lama secara otomatis.

Penyebab C: Cache Global NuGet (10 - 20+ GB)

Di %USERPROFILE%\.nuget\packages, tersimpan setiap versi pustaka yang pernah diunduh di komputer Anda.

Penyebab D: File Sementara Windows (Temp) (3 - 10 GB)

Ribuan file sisa kompilasi dan ekstraksi yang tertinggal di %LOCALAPPDATA%\Temp.


2. Jaminan Keamanan: Mengapa 100% Bebas Risiko?

Terlindungi (TIDAK PERNAH Dihapus) Aman Dihapus (100% Dapat Dibuat Ulang)
Kode Sumber: .cs, .xaml, .cpp, .json File objek perantara kompilator (obj/)
Definisi Proyek: .sln, .csproj, .wapproj Biner dan dependensi hasil kompilasi (bin/)
Repositori Git: Folder .git/, commit, branch Paket rilis Microsoft Store lama (AppPackages/)
Aset Asli: Tekstur, audio, model, shader Paket unduhan NuGet dalam cache (.nuget\packages)
Sertifikat: .pfx, StoreAssociation.xml File sementara sistem operasi (%LOCALAPPDATA%\Temp)

Apa yang terjadi saat membuka kembali Visual Studio?
Saat Anda membuka solusi dan mengeklik Build atau Rebuild, Visual Studio dan .NET SDK akan otomatis membuat ulang folder bin dan obj secara bersih dari kode sumber. Tidak ada progres kerja yang hilang.


3. Solusi Otomatisasi: Skrip Pembersih

Mesin Skrip PowerShell (Clean-DevDiskSpace.ps1)

Simpan di folder _tools/Clean-DevDiskSpace.ps1 pada direktori proyek Anda:

<#
.SYNOPSIS
    Alat Pembersih Ruang Disk untuk Developer
#>
[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 "PENGAMAN AKTIF: Jalur root terdeteksi, operasi dibatalkan!" -ForegroundColor Red
    exit 1
}

$systemDrive = Get-PSDrive -Name C
$freeGBBefore = [math]::Round($systemDrive.Free / 1GB, 2)
Write-Host "Ruang bebas saat ini di 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 "Mode pemindaian selesai." -ForegroundColor Yellow; return }
if (-not $Force) {
    $prompt = Read-Host "Mulai pembersihan aman? (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 "`nPEMBERSIHAN SELESAI! Ruang berhasil dipulihkan: +$freedTotal GB" -ForegroundColor Green

Peluncur Batch (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. Hasil Uji Lapangan Nyata

  • Ruang Bebas Sebelum Pembersihan: 1,35 GB (Peringatan merah kritis)
  • Ruang Bebas Setelah Pembersihan: 53,80 GB
  • Total Ruang yang Dipulihkan: +52,45 GB dalam waktu kurang dari 3 menit.

Tentang Arar Games & Game Kami

Jelajahi game indie kami dan terhubung dengan studio kami:

🎮 Game Kami

📱 Media Sosial Resmi

استعادة 50-100 جيجابايت: الدليل الشامل لتنظيف مساحة القرص لمطوري .NET والألعاب وتطبيقات سطح المكتب

استعادة 50-100 جيجابايت: الدليل الشامل لتنظيف مساحة القرص لمطوري .NET والألعاب وتطبيقات سطح المكتب

يواجه كل مطور برمجيات وألعاب على نظام Windows صباحًا حرجًا في نهاية المطاف: تشغّل جهازك، تفتح بيئة التطوير، وإذ بنظام Windows يعرض تحذيرًا عاجلًا—بقي أقل من 2 جيجابايت من المساحة الفارغة على محرك أقراص SSD بحجم 1 تيرابايت.

لم تقم بتنزيل مقاطع فيديو ضخمة، ولم تثبت ألعابًا جديدة بحجم 100 جيجابايت. إلى أين ذهبت كل هذه المساحة التخزينية؟

بصفتي مطور ألعاب مستقلة وتطبيقات سطح مكتب متعددة المنصات باستخدام .NET 8/9 و MonoGame و Android وحزم MSIX/WAP لمتجر Microsoft، قمت بفحص هذه الأزمة الصامتة. أظهر الفحص الآلي لمجلدات المشاريع أن أكثر من 68 جيجابايت كانت مشغولة بالكامل بنواتج البناء المؤقتة، وحزم المتاجر القديمة، وذاكرة التخزين المؤقت لحزم NuGet.

في هذا الدليل، نوضح الأسباب المعمارية لهذا التضخم، ونبين لماذا يعد حذف هذه المجلدات آمنًا بنسبة 100%، ونشارك نصوص PowerShell و Batch برمجية جاهزة لتفريغ عشرات الجيجابايت بنقرة واحدة.


1. أسباب تضخم مساحة التخزين لدى المطورين

عند بناء حلول برمجية تدعم منصات متعددة، تقوم أدوات البناء بمضاعفة الملفات الثنائية والوسائط في كل مرحلة:

flowchart TD
    subgraph "مساحة عمل المشروع"
        Code["الكود المصدري (.cs, .xaml, .json)\n(محمي - بضعة ميجابايت)"]
        Assets["الوسائط الأصلية (PNG, OGG, Shaders)\n(محمي)"]
        Git["سجل .git\n(محمي)"]
        
        BinObj["مجلدات bin و obj\n(ملفات DLL مؤقتة، رموز)\n[30 - 60 GB]"]
        AppPackages["WAP / MSIX AppPackages\n(حزم النشر القديمة)\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

السبب الأول: مجلدات bin و obj (30 - 60+ جيجابايت)

  • obj/ (المخرجات الوسيطة): تحتوي على حالات التجميع المتزايدة ونواتج المنصات المؤقتة. بالنسبة لمشاريع Android، يمكن أن يصل حجم هذا المجلد إلى 3-6 جيجابايت لكل مشروع.
  • bin/ (المخرجات الثنائية): تحتوي على الملفات التنفيذية وكافة الوسائط المنسوخة عبر <CopyToOutputDirectory>. إذا كانت 10 مشاريع تشير إلى مجلد وسائط مشترك بحجم 500 ميجابايت، يتم تكرار نسخه 10 مرات (إهدار 5 جيجابايت في حل واحد).

السبب الثاني: مجلدات AppPackages لمتجر Microsoft (5 - 20+ جيجابايت)

عند إنشاء حزم للمتجر، ينشئ Visual Studio ملفات .msixbundle و .msixupload كاملة مع رموز PDB. ولا يقوم أبدًا بحذف الإصدارات القديمة تلقائيًا.

السبب الثالث: ذاكرة NuGet المؤقتة العامة (10 - 20+ جيجابايت)

في المسار %USERPROFILE%\.nuget\packages، يتم الاحتفاظ بكل إصدار من كل حزمة تم تنزيلها على جهازك على الإطلاق.

السبب الرابع: ملفات Windows المؤقتة (Temp) (3 - 10 جيجابايت)

آلاف الملفات المؤقتة التي تتركها أدوات التجميع والضغط في المسار %LOCALAPPDATA%\Temp.


2. ضمان الأمان: لماذا العملية خالية من المخاطر بنسبة 100%؟

ملفات محمية (لا تُمس أبدًا) ملفات يمكن حذفها بأمان (تُعاد صياغتها بالكامل)
الكود المصدري: .cs, .xaml, .cpp, .json ملفات الكائنات المؤقتة للمترجم (obj/)
تعريفات المشاريع: .sln, .csproj, .wapproj الملفات الثنائية ومكتبات DLL المجمعة (bin/)
مستودعات Git: مجلد .git/ والفروع والالتزامات حزم إصدارات المتجر السابقة (AppPackages/)
الوسائط الأصلية: الصور والأصوات والمجسمات حزم NuGet المخزنة محليًا (.nuget\packages)
الشهادات: .pfx, StoreAssociation.xml ملفات النظام المؤقتة (%LOCALAPPDATA%\Temp)

ماذا يحدث عند إعادة فتح Visual Studio؟
بمجرد فتح الحل والضغط على Build أو Rebuild، يعيد Visual Studio و .NET SDK إنشاء مجلدات bin و obj فورًا من الكود المصدري. لا تفقد أي سطر كود أو إعدادات.


3. الحل البرمجي التلقائي: نصوص التنظيف

محرك PowerShell للتنظيف (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 "المساحة الفارغة قبل التنظيف: $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.35 إلى 53.80 جيجابايت

  • المساحة الفارغة قبل التنظيف: 1.35 جيجابايت (تحذير أحمر)
  • المساحة الفارغة بعد التنظيف: 53.80 جيجابايت
  • صافي المساحة المستعادة: +52.45 جيجابايت في أقل من 3 دقائق.

نبذة عن Arar Games وألعابنا

اكتشف ألعابنا المستقلة وتواصل مع الاستوديو:

🎮 ألعابنا

  • Blocked: Pixel Panzer: معارك دبابات آركيد كلاسيكية مع طقس ديناميكي ومواجهات زعماء ملحمية.
    Google Play (Android و PC)
  • PaintTrek: ألغاز ألوان نابضة بالحياة وحركة تلوين بكسل إبداعية.
    Google Play | Microsoft Store (PC و Xbox)
  • Space Dodger: لعبة تفادي عقبات فضائية سريعة الوتيرة لاختبار ردود الفعل.
    Google Play

📱 قنوات التواصل الاجتماعي الرسمية

Odzyskaj 50-100 GB: Kompletny przewodnik po czyszczeniu dysku dla programistów .NET, gier i aplikacji desktopowych

Odzyskaj 50-100 GB: Kompletny przewodnik po czyszczeniu dysku dla programistów .NET, gier i aplikacji desktopowych

Każdy programista pracujący w systemie Windows prędzej czy później spotyka się z tym samym problemem: uruchamiasz komputer, włączasz środowisko programistyczne i nagle Windows informuje, że na dysku SSD NVMe o pojemności 1 TB zostało mniej niż 2 GB wolnego miejsca.

Nie pobierałeś filmów w 4K ani nie instalowałeś nowych gier o wadze 100 GB. Gdzie podziała się cała przestrzeń?

Jako niezależny twórca gier i aplikacji desktopowych pracujący z .NET 8/9, MonoGame, Androidem oraz Windows Application Packaging (MSIX/WAP dla Microsoft Store) postanowiłem to zbadać. Automatyczne skanowanie repozytoriów projektowych wykazało, że ponad 68 GB zajmowały tymczasowe pliki kompilacji, archiwa starych pakietów instalacyjnych oraz globalna pamięć podręczna NuGet.

W tym przewodniku wyjaśniamy, dlaczego środowiska deweloperskie pochłaniają tak ogromne ilości pamięci, dlaczego usuwanie tych folderów jest w 100% bezpieczne, oraz udostępniamy gotowe skrypty PowerShell i Batch do natychmiastowego zwolnienia dziesiątek gigabajtów.


1. Skąd bierze się zapełnienie dysku programisty?

Podczas kompilacji rozwiązań wieloplatformowych narzędzia deweloperskie duplikują biblioteki i zasoby na każdym etapie:

flowchart TD
    subgraph "Przestrzeń robocza projektów"
        Code["Kod źródłowy (.cs, .xaml, .json)\n(Chroniony - Kilka MB)"]
        Assets["Oryginalne zasoby (PNG, OGG, Shaders)\n(Chronione)"]
        Git["Historia .git\n(Chroniona)"]
        
        BinObj["Foldery bin i obj\n(Pośrednie DLL, symbole, kopie)\n[30 - 60 GB]"]
        AppPackages["WAP / MSIX AppPackages\n(Stare pakiety sklepu)\n[5 - 20 GB]"]
    end

    subgraph "Pamięci podręczne systemu"
        NuGet["%USERPROFILE%\\.nuget\\packages\n(Globalny cache NuGet)\n[10 - 20 GB]"]
        Temp["%LOCALAPPDATA%\\Temp\n(Tymczasowe pliki kompilatora)\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

Przyczyna A: Foldery bin i obj (30 - 60+ GB)

  • obj/ (Wyniki pośrednie): Przechowuje stany kompilacji przyrostowej. Dla projektów Android folder ten potrafi osiągnąć 3 do 6 GB na jeden projekt.
  • bin/ (Pliki binarne): Zawiera gotowe pliki wykonywalne i zasoby powielone za pomocą <CopyToOutputDirectory>. Jeśli 10 projektów odwołuje się do wspólnego folderu z zawartością gry o wielkości 500 MB, dane te są powielane 10 razy (5 GB niepotrzebnie zajętego miejsca).

Przyczyna B: Foldery AppPackages ze sklepu Microsoft Store (5 - 20+ GB)

Podczas generowania paczek instalacyjnych Visual Studio tworzy pliki .msixbundle oraz .msixupload (z pełnymi symbolami PDB). Środowisko nigdy automatycznie nie kasuje starszych wersji.

Przyczyna C: Globalny cache NuGet (10 - 20+ GB)

W %USERPROFILE%\.nuget\packages przechowywana jest każda wersja każdej biblioteki kiedykolwiek pobranej na Twoim komputerze.

Przyczyna D: Pliki tymczasowe Windows (Temp) (3 - 10 GB)

W katalogu %LOCALAPPDATA%\Temp kompilatory i instalatory pozostawiają tysiące porzuconych plików roboczych.


2. Gwarancja bezpieczeństwa: Dlaczego to w 100% bezpieczne?

Chronione (NIGDY nieusuwane) Bezpieczne do usunięcia (100% odtwarzalne)
Kod źródłowy: .cs, .xaml, .cpp, .json Pliki obiektowe kompilatora (obj/)
Definicje projektów: .sln, .csproj, .wapproj Skompilowane pliki wykonywalne i DLL (bin/)
Repozytoria Git: Folder .git/, gałęzie i commity Stare pakiety wydań sklepowych (AppPackages/)
Oryginalne zasoby: Grafiki, dźwięki, shadery Pobrane pakiety NuGet (.nuget\packages)
Certyfikaty: .pfx, StoreAssociation.xml Pliki tymczasowe systemu (%LOCALAPPDATA%\Temp)

Co się stanie po ponownym otwarciu Visual Studio?
Wystarczy otworzyć projekt i kliknąć Kompiluj (Build) lub Przebuduj (Rebuild). Narzędzia SDK i kompilator automatycznie odtworzą strukturę folderów bin i obj z Twojego kodu źródłowego. Żadne dane ani ustawienia nie zostaną utracone.


3. Zautomatyzowane rozwiązanie: Skrypt czyszczący

Silnik PowerShell (Clean-DevDiskSpace.ps1)

Zapisz skrypt w _tools/Clean-DevDiskSpace.ps1 w katalogu swoich projektów:

<#
.SYNOPSIS
    Narzędzie do czyszczenia dysku dla programistów
#>
[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 "BLOKADA BEZPIECZEŃSTWA: Wykryto ścieżkę główną dysku!" -ForegroundColor Red
    exit 1
}

$systemDrive = Get-PSDrive -Name C
$freeGBBefore = [math]::Round($systemDrive.Free / 1GB, 2)
Write-Host "Wolne miejsce na dysku C przed czyszczeniem: $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 "Skanowanie zakończone." -ForegroundColor Yellow; return }
if (-not $Force) {
    $prompt = Read-Host "Czy chcesz rozpocząć bezpieczne czyszczenie? (T/N)"
    if ($prompt -notin @('T', 't', '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 "`nCZYSZCZENIE ZAKOŃCZONE! Odzyskano: +$freedTotal GB" -ForegroundColor Green

Plik wsadowy (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. Rzeczywiste wyniki testów

  • Wolne miejsce przed czyszczeniem: 1,35 GB (Stan krytyczny)
  • Wolne miejsce po czyszczeniu: 53,80 GB
  • Odzyskana przestrzeń: +52,45 GB w mniej niż 3 minuty.

O Arar Games i naszych grach

Odkryj nasze gry niezależne i śledź nasze studio:

🎮 Nasze gry

📱 Oficjalne media społecznościowe

50-100 GB डिस्क स्पेस सुरक्षित रूप से खाली करें: .NET, गेम और डेस्कटॉप डेवलपर्स के लिए संपूर्ण गाइड

50-100 GB डिस्क स्पेस सुरक्षित रूप से खाली करें: .NET, गेम और डेस्कटॉप डेवलपर्स के लिए संपूर्ण गाइड

Windows पर काम करने वाले हर सॉफ़्टवेयर और गेम डेवलपर को कभी न कभी उस डरावनी सुबह का सामना करना पड़ता है: आप अपना कंप्यूटर चालू करते हैं, अपना IDE खोलते हैं, और अचानक Windows चेतावनी देता है—आपके 1 TB NVMe SSD पर 2 GB से भी कम खाली स्थान बचा है।

आपने कोई बड़ी वीडियो फ़ाइलें डाउनलोड नहीं की हैं और न ही 100 GB का कोई नया गेम इंस्टॉल किया है। तो सारा स्थान कहाँ गायब हो गया?

.NET 8/9, MonoGame, Android, और Microsoft Store (MSIX/WAP पैकेजिंग) पर काम करने वाले एक इंडी गेम और डेस्कटॉप डेवलपर के रूप में मैंने इस समस्या की जाँच की। स्वचालित स्कैन से पता चला कि 68 GB से अधिक स्थान केवल अप्रचलित बिल्ड आर्टिफैक्ट्स, पुराने स्टोर पैकेज और NuGet कैश द्वारा घेरा गया था।

इस गाइड में, हम समझेंगे कि आधुनिक टूलचेन इतना अधिक स्थान क्यों घेरते हैं, इन फ़ोल्डरों को हटाना 100% सुरक्षित क्यों है, और एक-क्लिक में दर्जनों गीगाबाइट खाली करने के लिए तैयार PowerShell और Batch स्क्रिप्ट साझा करेंगे।


1. डिस्क स्पेस भरने के मुख्य कारण

जब आप क्रॉस-प्लेटफ़ॉर्म प्रोजेक्ट्स को कंपाइल करते हैं, तो टूल्स हर चरण पर फ़ाइलों की प्रतियाँ बनाते हैं:

flowchart TD
    subgraph "प्रोजेक्ट कार्यक्षेत्र"
        Code["सोर्स कोड (.cs, .xaml, .json)\n(सुरक्षित - कुछ MB)"]
        Assets["मूल एसेट्स (PNG, OGG, Shaders)\n(सुरक्षित)"]
        Git[".git इतिहास\n(सुरक्षित)"]
        
        BinObj["bin और obj फ़ोल्डर्स\n(मध्यवर्ती DLLs, सिंबल)\n[30 - 60 GB]"]
        AppPackages["WAP / MSIX AppPackages\n(पुराने स्टोर पैकेज)\n[5 - 20 GB]"]
    end

    subgraph "सिस्टम और ग्लोबल कैश"
        NuGet["%USERPROFILE%\\.nuget\\packages\n(ग्लोबल पैकेज कैश)\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

कारण A: bin और obj फ़ोल्डर्स (30 - 60+ GB)

  • obj/ (मध्यवर्ती आउटपुट): कंपाइलर की अस्थायी स्थिति रखता है। Android प्रोजेक्ट्स में यह फ़ोल्डर 3 से 6 GB तक बढ़ जाता है।
  • bin/ (बाइनरी आउटपुट): अंतिम निष्पादन योग्य फ़ाइलें और कॉपी किए गए सभी एसेट्स रखता है। यदि 10 प्रोजेक्ट 500 MB के एक सामान्य गेम कंटेंट को संदर्भित करते हैं, तो वह 10 बार कॉपी होकर 5 GB बर्बाद करता है।

कारण B: Microsoft Store AppPackages फ़ोल्डर्स (5 - 20+ GB)

स्टोर पैकेज बनाते समय Visual Studio .msixbundle और .msixupload फ़ाइलें उत्पन्न करता है। यह पुराने संस्करणों को कभी अपने-आप नहीं हटाता।

कारण C: ग्लोबल NuGet पैकेज कैश (10 - 20+ GB)

%USERPROFILE%\.nuget\packages में डाउनलोड किए गए हर पैकेज का हर संस्करण सुरक्षित रहता है।

कारण D: Windows Temp फ़ाइलें (3 - 10 GB)

कंपाइलिंग के दौरान %LOCALAPPDATA%\Temp में छूटी हुई हज़ारों अस्थायी फ़ाइलें।


2. सुरक्षा की गारंटी: यह 100% जोखिम-मुक्त क्यों है?

सुरक्षित (कभी नहीं हटाई जाती) हटाने के लिए सुरक्षित (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 पर क्लिक करते हैं, तो Visual Studio आपके सोर्स कोड से bin और obj फ़ोल्डरों को अपने-आप नए सिरे से बना देता है। आपका कोई भी कोड नष्ट नहीं होता।


3. ऑटोमेशन स्क्रिप्ट: एक क्लिक में सफ़ाई

PowerShell स्क्रिप्ट (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.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

📱 आधिकारिक सोशल मीडिया

Recuperare 50-100 GB: Guida Completa alla Pulizia Disco per Sviluppatori .NET, Giochi e Desktop

Recuperare 50-100 GB: Guida Completa alla Pulizia Disco per Sviluppatori .NET, Giochi e Desktop

Ogni sviluppatore di software e videogiochi su Windows prima o poi vive questo incubo: accendi il PC, apri il tuo ambiente di sviluppo e improvvisamente Windows avvisa che sul tuo SSD NVMe da 1 TB sono rimasti meno di 2 GB di spazio libero.

Non hai scaricato video enormi né installato giochi pesanti. Dove è finito tutto lo spazio?

Lavorando come sviluppatore indie su progetti .NET 8/9, MonoGame, Android e Windows Application Packaging (MSIX/WAP per Microsoft Store), ho analizzato a fondo questa crisi di memoria. Tramite una scansione automatica nei miei repository, ho scoperto che oltre 68 GB erano occupati esclusivamente da file temporanei di compilazione, vecchi pacchetti di pubblicazione e cache di dipendenze.

In questa guida spieghiamo perché le moderne pipeline di sviluppo consumano così tanto spazio, perché eliminare queste cartelle è sicuro al 100% e forniamo uno script PowerShell e Batch per liberare decine di gigabyte in un clic.


1. Da dove nasce lo spreco di spazio su disco?

Compilando soluzioni multipiattaforma per Desktop, Mobile (Android) e Microsoft Store, i compilatori duplicano binari intermedi e risorse a ogni passaggio:

flowchart TD
    subgraph "Workspace di Progetto"
        Code["Codice Sorgente (.cs, .xaml, .json)\n(Protetto - Pochi MB)"]
        Assets["Asset Originali (PNG, OGG, Shader)\n(Protetto)"]
        Git["Cronologia .git\n(Protetto)"]
        
        BinObj["Cartelle bin e obj\n(DLL intermedie, simboli)\n[30 - 60 GB]"]
        AppPackages["WAP / MSIX AppPackages\n(Storico pacchetti store)\n[5 - 20 GB]"]
    end

    subgraph "Cache di Sistema"
        NuGet["%USERPROFILE%\\.nuget\\packages\n(Cache Globale NuGet)\n[10 - 20 GB]"]
        Temp["%LOCALAPPDATA%\\Temp\n(File temporanei del compilatore)\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

Causa A: Cartelle bin e obj (30 - 60+ GB)

  • obj/ (Output Intermedio): Mantiene gli stati della compilazione incrementale. Per i target Android, questa cartella può raggiungere da 3 a 6 GB per singolo progetto.
  • bin/ (Output Binario): Contiene gli eseguibili e tutte le risorse duplicate tramite <CopyToOutputDirectory>. Se 10 progetti referenziano una cartella comune di 500 MB di asset, quel contenuto viene copiato 10 volte (5 GB sprecati).

Causa B: Cartelle AppPackages di Microsoft Store (5 - 20+ GB)

Quando si creano pacchetti di pubblicazione, Visual Studio genera file .msixbundle e .msixupload (con simboli PDB completi). Visual Studio non cancella mai automaticamente le versioni precedenti.

Causa C: Cache Globale NuGet (10 - 20+ GB)

In %USERPROFILE%\.nuget\packages viene conservata ogni singola versione di ogni pacchetto mai scaricato sulla macchina.

Causa D: File Temporanei di Windows (Temp) (3 - 10 GB)

Migliaia di file temporanei abbandonati da MSBuild e dagli strumenti di compressione in %LOCALAPPDATA%\Temp.


2. Garanzia di Sicurezza: Perché è Privo di Rischi al 100%?

Protetto (NON viene mai toccato) Sicuro da Eliminare (100% Rigenerabile)
Codice Sorgente: .cs, .xaml, .cpp, .json File oggetto intermedi di compilazione (obj/)
Definizioni di Progetto: .sln, .csproj, .wapproj Binari compilati e assembly duplicati (bin/)
Repository Git: Cartella .git/, commit e branch Vecchi pacchetti di pubblicazione (AppPackages/)
Asset Originali: Texture, audio, modelli e shader Pacchetti memorizzati nella cache locale (.nuget\packages)
Certificati: .pfx, StoreAssociation.xml File temporanei del sistema operativo (%LOCALAPPDATA%\Temp)

Cosa succede alla riapertura di Visual Studio?
Aprendo la soluzione e cliccando su Genera (Build) o Rigenera (Rebuild), il compilatore ricrea le cartelle bin e obj dal codice sorgente. NuGet riscarica i pacchetti mancanti. Nessun progresso viene perso.


3. Lo Script di Pulizia Automatizzato

Motore PowerShell (Clean-DevDiskSpace.ps1)

Salva questo script in _tools/Clean-DevDiskSpace.ps1:

<#
.SYNOPSIS
    Strumento di Pulizia Disco per Sviluppatori
#>
[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 "BLOCCO DI SICUREZZA: Percorso radice rilevato!" -ForegroundColor Red
    exit 1
}

$systemDrive = Get-PSDrive -Name C
$freeGBBefore = [math]::Round($systemDrive.Free / 1GB, 2)
Write-Host "Spazio libero prima della pulizia: $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 "Scansione terminata." -ForegroundColor Yellow; return }
if (-not $Force) {
    $prompt = Read-Host "Avviare la pulizia sicura? (S/N)"
    if ($prompt -notin @('S', 's', 'Y', 'y', 'Si', 'si')) { 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 "`nPULIZIA COMPLETATA! Spazio recuperato: +$freedTotal GB" -ForegroundColor Green

Avvio Veloce via Batch (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. Risultati dal Campo: Da 1,35 GB a 53,80 GB

  • Spazio libero iniziale: 1,35 GB (Allarme rosso)
  • Spazio libero finale: 53,80 GB
  • Spazio netto recuperato: +52,45 GB in meno di 3 minuti.

Informazioni su Arar Games e i Nostri Giochi

Scopri i nostri titoli indie e segui il nostro studio:

🎮 I Nostri Giochi

📱 Canali Social Ufficiali

50~100GB 안전하게 확보하기: .NET, 게임 및 데스크톱 개발자를 위한 디스크 정리 완벽 가이드

50~100GB 안전하게 확보하기: .NET, 게임 및 데스크톱 개발자를 위한 디스크 정리 완벽 가이드

Windows 환경에서 소프트웨어 및 게임을 개발하는 모든 엔지니어는 언젠가 악몽 같은 아침을 맞이하게 됩니다. 작업을 위해 PC를 켜고 IDE를 실행하는 순간, Windows에서 1TB NVMe SSD의 여유 공간이 2GB 미만으로 남았다는 경고를 띄웁니다.

대용량 동영상을 다운로드한 적도 없고, 100GB짜리 새 게임을 설치한 적도 없습니다. 대체 그 많은 용량은 어디로 사라진 것일까요?

.NET 8/9, MonoGame, Android, Microsoft Store용 WAP/MSIX 패키징을 다루는 인디 게임 및 데스크톱 개발자로서 조사한 결과, 프로젝트 작업 영역 내에 68GB 이상의 불필요한 빌드 아티팩트와 패키지 캐시가 쌓여 있음을 확인했습니다.

이 가이드에서는 디스크 용량이 낭비되는 구조적 원인을 분석하고, 해당 폴더를 삭제해도 100% 안전한 이유를 설명하며, 클릭 한 번으로 수십 기가바이트를 복구할 수 있는 자동화 스크립트를 공유합니다.


1. 개발자 디스크 낭비의 원인 분석

크로스 플랫폼 솔루션을 컴파일할 때, 빌드 도구는 모든 단계에서 바이너리와 에셋을 복제합니다:

flowchart TD
    subgraph "프로젝트 작업 공간"
        Code["소스 코드 (.cs, .xaml, .json)\n(보호 대상 - 수 MB)"]
        Assets["원본 에셋 (PNG, OGG, Shaders)\n(보호 대상)"]
        Git[".git 버전 기록\n(보호 대상)"]
        
        BinObj["bin 및 obj 폴더\n(중간 DLL, 기호, 복사본)\n[30 - 60 GB]"]
        AppPackages["WAP / MSIX AppPackages\n(과거 스토어 배포 패키지)\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 대상 프로젝트의 경우 프로젝트당 3~6GB까지 불어납니다.
  • bin/ (바이너리 출력): 실행 파일과 <CopyToOutputDirectory>로 복사된 모든 에셋을 포함합니다. 10개 프로젝트가 500MB짜리 공통 게임 에셋을 참조할 경우 총 5GB가 중복 복사됩니다.

주범 2: Microsoft Store AppPackages 폴더 (5 ~ 20GB 이상)

스토어 제출용 패키지를 생성할 때마다 디버깅 심볼(PDB)이 포함된 .msixbundle 및 .msixupload 파일이 누적됩니다. Visual Studio는 이전 버전을 자동으로 삭제하지 않습니다.

주범 3: 전역 NuGet 캐시 (10 ~ 20GB 이상)

%USERPROFILE%\.nuget\packages에는 시스템에 다운로드된 모든 패키지의 과거 버전이 영구 보관됩니다.

주범 4: Windows 임시 파일 (Temp) (3 ~ 10GB)

컴파일 및 압축 도구가 %LOCALAPPDATA%\Temp에 남긴 수만 개의 임시 작업 파일입니다.


2. 안전성 보장: 왜 100% 위험이 없는가?

보호 대상 (절대 삭제 안 됨) 안전한 삭제 대상 (100% 자동 재생성 가능)
소스 코드: .cs, .xaml, .cpp, .json 등 컴파일러 중간 개체 파일 (obj/)
프로젝트 정의: .sln, .csproj, .wapproj 컴파일된 바이너리 및 출력 DLL (bin/)
Git 저장소: .git/ 폴더, 커밋 기록, 브랜치 이전 스토어 배포 패키지 (AppPackages/)
원본 에셋: 텍스처, 사운드, 셰이더 캐시된 NuGet 패키지 (.nuget\packages)
인증서: .pfx, StoreAssociation.xml Windows 시스템 임시 파일 (%LOCALAPPDATA%\Temp)

Visual Studio를 다시 열면 어떻게 되나요?
프로젝트를 열고 빌드(Build) 또는 **다시 빌드(Rebuild)**를 클릭하면 소스 코드에서 최신 bin 및 obj 폴더가 완전히 새로 생성됩니다. 코드나 설정은 절대 손상되지 않습니다.


3. 원클릭 자동 정리 스크립트

PowerShell 정리 엔진 (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 채널

Как освободить 50-100 ГБ: Полное руководство по очистке диска для .NET, геймдев и десктоп разработчиков

Как освободить 50-100 ГБ: Полное руководство по очистке диска для .NET, геймдев и десктоп разработчиков

Каждый разработчик под Windows рано или поздно сталкивается с критической ситуацией: вы включаете компьютер, запускаете IDE, и система сообщает, что на вашем NVMe SSD объемом 1 ТБ осталось менее 2 ГБ свободного места.

Вы не скачивали огромных видеофайлов и не устанавливали новые игры. Куда ушло всё свободное пространство?

Как разработчик инди-игр и кроссплатформенных настольных приложений на .NET 8/9, MonoGame, Android и Windows Application Packaging (MSIX/WAP для Microsoft Store), я провел детальное расследование. Автоматическое сканирование рабочих директорий показало: более 68 ГБ было занято промежуточными артефактами сборки, старыми пакетами публикации и глобальным кэшем пакетов.

В этом руководстве мы разберем причины разрастания данных, докажем, почему очистка этих каталогов на 100% безопасна, и предоставим готовые скрипты PowerShell и Batch для моментального освобождения десятков гигабайт.


1. Откуда берется переполнение диска?

При компиляции мультиплатформенных решений компилятор и сборочные утилиты многократно дублируют промежуточные библиотеки и ресурсы:

flowchart TD
    subgraph "Рабочая область проектов"
        Code["Исходный код (.cs, .xaml, .json)\n(Защищен - Несколько МБ)"]
        Assets["Оригинальные ассеты (PNG, OGG, Shaders)\n(Защищены)"]
        Git["История .git\n(Защищена)"]
        
        BinObj["Папки bin и obj\n(Промежуточные DLL, символы, копии)\n[30 - 60 GB]"]
        AppPackages["WAP / MSIX AppPackages\n(Старые пакеты для магазина)\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 - 60+ ГБ)

  • obj/ (Промежуточный вывод): Хранит состояние инкрементальной сборки и промежуточные файлы платформы. Для Android-проектов объем этой папки может достигать 3–6 ГБ на проект.
  • bin/ (Итоговый вывод): Содержит исполняемые файлы и все ресурсы, скопированные через <CopyToOutputDirectory>. Если 10 проектов ссылаются на общую папку с ассетами игры объемом 500 МБ, она копируется 10 раз (5 ГБ лишних данных).

Причина 2: Папки AppPackages для Microsoft Store (5 - 20+ ГБ)

При создании пакетов MSIX/WAP Visual Studio генерирует файлы .msixbundle и .msixupload (с полными PDB-символами). Старые версии сборок среда разработки никогда не удаляет автоматически.

Причина 3: Глобальный кэш NuGet (10 - 20+ ГБ)

В директории %USERPROFILE%\.nuget\packages хранятся абсолютно все когда-либо загруженные версии библиотек.

Причина 4: Временные файлы Windows (Temp) (3 - 10 ГБ)

В %LOCALAPPDATA%\Temp компиляторы оставляют тысячи служебных файлов, которые накапливаются месяцами.


2. Гарантия безопасности: Почему это на 100% безвредно?

Защищено (НИКОГДА не удаляется) Безопасно к удалению (100% восстановимо)
Исходный код: .cs, .xaml, .cpp, .json Промежуточные объектные файлы (obj/)
Файлы проектов: .sln, .csproj, .wapproj Скомпилированные библиотеки и бинарники (bin/)
Репозитории Git: Папка .git/, ветки, коммиты Старые пакеты публикации магазина (AppPackages/)
Оригинальные ассеты: Текстуры, звуки, шейдеры Загруженные пакеты в кэше (.nuget\packages)
Сертификаты: .pfx, StoreAssociation.xml Временные системные файлы (%LOCALAPPDATA%\Temp)

Что произойдет при повторном открытии IDE?
При нажатии Собрать (Build) или Пересобрать (Rebuild) Visual Studio и .NET SDK автоматически пересоберут папки bin и obj из исходного кода. NuGet скачает недостающие зависимости. Никакой код и настройки не теряются.


3. Автоматизация: Скрипты PowerShell и Batch

Скрипт PowerShell (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 ГБ" -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 ГБ" -ForegroundColor Green

Запуск через Batch (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.35 ГБ до 53.80 ГБ

  • До очистки: 1.35 ГБ свободного места
  • После очистки: 53.80 ГБ свободного места
  • Итого освобождено: +52.45 ГБ менее чем за 3 минуты.

Об Arar Games и наших играх

Познакомьтесь с нашими инди-играми и следите за новостями студии:

🎮 Наши игры

  • Blocked: Pixel Panzer: Ретро-аркадные танковые сражения с динамической погодой и боссами.
    Google Play (Android и ПК)
  • PaintTrek: Красочные головоломки и пиксельное рисование.
    Google Play | Microsoft Store (ПК и Xbox)
  • Space Dodger: Динамичное аркадное уклонение от космических препятствий на реакцию.
    Google Play

📱 Официальные социальные сети

Recupere 50 a 100 GB: O Guia Definitivo de Limpeza de Disco para Desenvolvedores .NET, Jogos e Desktop

Recupere 50 a 100 GB: O Guia Definitivo de Limpeza de Disco para Desenvolvedores .NET, Jogos e Desktop

Todo desenvolvedor de software e jogos no Windows já passou por aquela manhã crítica: você liga o PC, abre o IDE e o sistema emite um alerta—seu SSD NVMe de 1 TB tem menos de 2 GB de espaço livre restante.

Você não baixou vídeos gigantescos nem instalou novos jogos de 100 GB. Para onde foi todo esse espaço?

Como desenvolvedor de jogos indie e aplicativos desktop multiplataforma utilizando .NET 8/9, MonoGame, Android e Windows Application Packaging (MSIX/WAP para a Microsoft Store), investiguei essa crise silenciosa de armazenamento. Ao rodar uma varredura automatizada nos meus projetos, descobri que mais de 68 GB estavam ocupados exclusivamente por artefatos descartáveis de compilação, pacotes de distribuição obsoletos e caches de dependências.

Neste guia, analisamos as causas do consumo excessivo, mostramos por que purgar esses arquivos é 100% seguro e disponibilizamos um script em PowerShell e Batch pronto para uso em qualquer workspace.


1. A Anatomia do Consumo Silencioso de Disco

Ao compilar soluções multiplataforma, os compiladores e ferramentas de empacotamento duplicam arquivos e binários a cada etapa:

flowchart TD
    subgraph "Workspace de Projetos"
        Code["Código-Fonte (.cs, .xaml, .json)\n(Protegido - Poucos MBs)"]
        Assets["Assets Brutos (PNG, OGG, Shaders)\n(Protegido)"]
        Git["Histórico .git\n(Protegido)"]
        
        BinObj["Pastas bin e obj\n(DLLs intermediárias, símbolos)\n[30 - 60 GB]"]
        AppPackages["WAP / MSIX AppPackages\n(Pacotes históricos de loja)\n[5 - 20 GB]"]
    end

    subgraph "Caches do Sistema"
        NuGet["%USERPROFILE%\\.nuget\\packages\n(Cache global NuGet)\n[10 - 20 GB]"]
        Temp["%LOCALAPPDATA%\\Temp\n(Arquivos temporários do compilador)\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

Vilão A: Pastas bin e obj (30 a 60+ GB)

  • obj/ (Saída Intermediária): Guarda estados de compilação incremental e arquivos temporários de plataforma. Para Android, essa pasta pode atingir de 3 a 6 GB por projeto.
  • bin/ (Saída Binária): Contém os executáveis e todos os arquivos copiados via <CopyToOutputDirectory>. Se 10 projetos referenciam uma pasta comum de assets de 500 MB, esse conteúdo é duplicado 10 vezes (5 GB consumidos).

Vilão B: Pastas AppPackages da Microsoft Store (5 a 20+ GB)

Ao empacotar para a loja, o Visual Studio cria arquivos .msixbundle e .msixupload (com símbolos PDB) para cada versão gerada. O IDE nunca apaga versões antigas automaticamente.

Vilão C: Cache Global do NuGet (10 a 20+ GB)

Em %USERPROFILE%\.nuget\packages, ficam armazenadas todas as versões de todos os pacotes já baixados na máquina.

Vilão D: Arquivos Temporários do Windows (Temp) (3 a 10 GB)

No diretório %LOCALAPPDATA%\Temp, compiladores e empacotadores deixam milhares de arquivos órfãos com o passar dos meses.


2. Garantia de Segurança: Por que é 100% Livre de Riscos?

Protegido (NUNCA é apagado) Seguro de Apagar (100% Descartável)
Código-Fonte: .cs, .xaml, .cpp, .json Arquivos-objeto gerados pelo compilador (obj/)
Definições de Projeto: .sln, .csproj, .wapproj Binários compilados e dependências locais (bin/)
Repositórios Git: Pasta .git/, histórico e branches Pacotes antigos de publicação em loja (AppPackages/)
Assets Originais: Texturas, áudio, modelos e shaders Pacotes em cache local do NuGet (.nuget\packages)
Certificados: .pfx, StoreAssociation.xml Arquivos temporários do Windows (%LOCALAPPDATA%\Temp)

O que acontece ao reabrir o Visual Studio?
Ao abrir o projeto e clicar em Compilar (Build) ou Recompilar (Rebuild), o Visual Studio e o .NET SDK recriam as pastas bin/ e obj/ automaticamente a partir do código-fonte. O NuGet restaura as dependências ausentes. Nenhum dado é perdido.


3. Solução Automatizada: Script de Limpeza Rápida

Script em PowerShell (Clean-DevDiskSpace.ps1)

Salve em _tools/Clean-DevDiskSpace.ps1:

<#
.SYNOPSIS
    Ferramenta de Limpeza de Disco para Desenvolvedores
#>
[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 "BLOQUEIO DE SEGURANÇA: Caminho de raiz detectado!" -ForegroundColor Red
    exit 1
}

$systemDrive = Get-PSDrive -Name C
$freeGBBefore = [math]::Round($systemDrive.Free / 1GB, 2)
Write-Host "Espaço livre atual no 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 "Modo verificação concluído." -ForegroundColor Yellow; return }
if (-not $Force) {
    $prompt = Read-Host "Deseja prosseguir com a limpeza segura? (S/N)"
    if ($prompt -notin @('S', 's', '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 "`nLIMPEZA CONCLUÍDA! Espaço recuperado: +$freedTotal GB" -ForegroundColor Green

Inicializador Batch (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. Resultados Reais: De 1,35 GB a 53,80 GB

Em teste real realizado em um workspace com múltiplos projetos:

  • Espaço Livre Inicial: 1,35 GB (Disco em nível crítico)
  • Espaço Livre Final: 53,80 GB
  • Espaço Recuperado: +52,45 GB em menos de 3 minutos.

Sobre a Arar Games e Nossos Jogos

Conheça nossos jogos indie e acompanhe o estúdio:

🎮 Nossos Jogos

📱 Redes Sociais Oficiais

安全释放 50-100 GB 空间:.NET、游戏引擎与桌面开发者终极磁盘清理指南

安全释放 50-100 GB 空间:.NET、游戏引擎与桌面开发者终极磁盘清理指南

在 Windows 下进行开发时,每个程序员几乎都会遭遇这样的清晨:打开工作站和 IDE,系统突然弹窗警告——1 TB 的 NVMe 固态硬盘剩余空间已不足 2 GB。

你没有下载大型电影,也没有安装 100 GB 的 3A 大作。硬盘空间究竟去哪了?

作为一名使用 .NET 8/9、MonoGame、Android 和 Windows 应用打包(Microsoft Store 的 MSIX/WAP) 的跨平台独立游戏与桌面开发者,我近期对这种“隐形硬盘刺客”进行了彻底排查。通过对工程目录进行自动化扫描,我发现有超过 68 GB 的空间完全被临时构建产物、历史分发包和包缓存所侵占。

本文将解析现代构建工具链导致存储膨胀的根本原因,解释为何清除这些文件100% 安全,并提供一套可一键运行的 PowerShell 与 Batch 自动化脚本,助你瞬间回收数十 GB 磁盘空间。


1. 开发者磁盘空间膨胀的根源

当构建面向桌面、移动端(Android)及应用商店的跨平台解决方案时,编译器与打包流水线会在每个环节复制中间文件和资源:

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 等)\n[5 - 20 GB]"]
    end

    subgraph "系统与全局缓存"
        NuGet["%USERPROFILE%\\.nuget\\packages\n(全局包缓存)\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

元凶 A:bin 与 obj 文件夹(30 - 60+ GB)

  • obj/(中间输出): 保存增量编译状态及平台特定中间物。在跨平台项目中,单个 Android 项目的中间生成物就可达 3 到 6 GB。
  • bin/(二进制输出): 包含生成的可执行文件及通过 <CopyToOutputDirectory> 复制的所有资产。若 10 个项目引用一个 500 MB 的公共内容目录,该内容就会被复制 10 次,产生 5 GB 的重复浪费。

元凶 B:Microsoft Store AppPackages 目录(5 - 20+ GB)

使用 WAP 项目为应用商店打包时,每次都会生成完整的 .msixbundle、带有 PDB 符号的 .msixupload 以及本地测试包。单个包体积通常在 800 MB 至 2.5 GB 之间,Visual Studio 从不自动删除旧版本,日积月累极为惊人。

元凶 C:全局 NuGet 包缓存(10 - 20+ GB)

位于 %USERPROFILE%\.nuget\packages,记录着历史上下载过的所有依赖项版本。库一旦升级,旧版本就会永远驻留在硬盘中。

元凶 D:Windows Temp 临时文件(3 - 10 GB)

编译与压缩过程中留在 %LOCALAPPDATA%\Temp 中的海量临时缓存。


2. 安全性保障:为什么清理是 100% 零风险的?

严格保护(绝不触碰) 安全清理(100% 可自动重建)
源代码: .cs、.xaml、.cpp、.json 等 编译器生成的中间目标文件 (obj/)
解决方案与工程定义: .sln、.csproj、.wapproj 编译生成的程序集与 DLL 副本 (bin/)
Git 仓库: .git/ 文件夹、分支与提交历史 过期的商店分发与测试包 (AppPackages/)
原始资源: 纹理、音频、字体与着色器源文件 本地缓存的 NuGet 下载包 (.nuget\packages)
证书与配置: .pfx、StoreAssociation.xml Windows 系统临时目录缓存 (%LOCALAPPDATA%\Temp)

重新打开 Visual Studio 时会发生什么?
点击 生成 (Build) 或 重新生成 (Rebuild) 后,SDK 与编译器会自动根据源代码重新生成全新的 bin 和 obj 目录,NuGet 会自动拉取所需包。代码和开发进度绝对不受影响。


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.35 GB 飙升至 53.80 GB

在包含游戏引擎、移动应用及多套桌面项目的真实工作区实测:

  • 清理前剩余: 1.35 GB(系统红条告警)
  • 清理后剩余: 53.80 GB
  • 净回收空间: +52.45 GB(仅耗时不到 3 分钟)

关于 Arar Games 与我们的游戏产品

探索我们的独立游戏作品并关注我们的工作室:

🎮 旗下游戏

📱 关注官方社交媒体

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アカウント