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

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