27 Ekim 2026 Salı

50-100 GB Boş Alan Kazanma: .NET, Oyun ve Masaüstü Geliştiricileri İçin Kapsamlı Disk Temizleme Rehberi




50-100 GB Boş Alan Kazanma: .NET, Oyun ve Masaüstü Geliştiricileri İçin Kapsamlı Disk Temizleme Rehberi

Windows ortamında çalışan her yazılım ve oyun geliştiricisi er ya da geç o korkunç sabahla karşılaşır: Bilgisayarınızı açarsınız, IDE'nizi başlatırsınız ve aniden Windows bildirim verir—1 TB NVMe SSD diskinizde 2 GB'tan az boş alan kalmıştır.

Büyük boyutlu video dosyaları indirmediniz. 100 GB'lık yeni oyunlar yüklemediniz. Peki bu alan nereye gitti?

Bir bağımsız oyun ve çok platformlu masaüstü geliştiricisi olarak .NET 8/9, MonoGame, Android / Mobil ve Windows Application Packaging (Microsoft Store için MSIX/WAP) projeleriyle çalışırken bu sessiz SSD krizini bizzat yaşadım. Çalışma dizinimdeki projeler üzerinde otomatik bir tarama gerçekleştirdiğimde, 68 GB'ın üzerinde alanın tamamen gereksiz derleme artıkları, eski mağaza paketleme çıktıları ve paket önbellekleri tarafından işgal edildiğini gördüm.

Bu rehberde; modern geliştirici araçlarının neden bu kadar devasa disk alanı tükettiğini, bu klasörleri temizlemenin neden %100 güvenli olduğunu ve herhangi bir projeye ekleyip tek tıkla onlarca gigabayt yer kazanabileceğiniz otomatik PowerShell ve Batch betiklerini paylaşıyoruz.


1. Geliştirici Disk Şişmesinin Anatomisi

Bu devasa depolama alanı nereye kayboluyor? Masaüstü, Mobil (Android) ve Microsoft Store'u hedefleyen çok platformlu çözümler geliştirirken, derleyiciler ve paketleme araçları her adımda ikili dosyaları ve asset'leri çoğaltır.

flowchart TD
    subgraph "Proje Çalışma Alanınız"
        Code["Kaynak Kodlar (.cs, .xaml, .json)\n(Korunan - Birkaç MB)"]
        Assets["Ham Asset Kaynakları (PNG, OGG, Shader)\n(Korunan)"]
        Git[".git Geçmişi\n(Korunan)"]
        
        BinObj["bin ve obj Klasörleri\n(Ara DLL'ler, semboller, kopyalar)\n[30 - 60 GB]"]
        AppPackages["WAP / MSIX AppPackages\n(Geçmiş .msixbundle, .msixupload)\n[5 - 20 GB]"]
    end

    subgraph "Sistem ve Global Önbellekler"
        NuGet["%USERPROFILE%\\.nuget\\packages\n(Global Paket Önbelleği)\n[10 - 20 GB]"]
        Temp["%LOCALAPPDATA%\\Temp\n(Derleyici geçici dosyaları, loglar)\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

Baş Şüpheli A: bin ve obj Klasörleri (30 - 60+ GB)

Her C# projesi derleme sırasında iki klasör üretir:

  • obj/ (Ara Çıktı): Kademeli derleme durumlarını, kaynak üretici (Source Generator) dosyalarını ve platforma özel paket ara ürünlerini saklar. Çoklu hedefli projelerde (örneğin net9.0-windows10.0 ve net9.0-android), yalnızca Android ara çıktıları proje başına 3 ila 6 GB'a kadar şişebilir.
  • bin/ (İkili Çıktı): Nihai assembly dosyalarını, çalışma zamanı bağımlılıklarını ve <CopyToOutputDirectory> ile kopyalanan tüm asset dosyalarını barındırır. Çözümünüzde 500 MB'lık ortak bir oyun içerik klasörüne referans veren 10 proje varsa, bu içerik 10 kez kopyalanır ve tek bir çözüm için 5 GB çöpe gider!

Baş Şüpheli B: Microsoft Store AppPackages Klasörleri (5 - 20+ GB)

Masaüstü oyunlarınızı veya uygulamalarınızı Windows Application Packaging (WAP) projesiyle Microsoft Store'a yayınlıyorsanız, Visual Studio AppPackages adında özel bir klasör oluşturur.

  • Her sürüm için tam bir .msixbundle, kilitlenmelerin analizi için hata ayıklama sembollerini (PDB) içeren bir .msixupload ve test kurulum klasörleri üretilir.
  • Tek bir yayın paketi genellikle 800 MB ile 2.5 GB arasındadır. 10 test sürümü veya güncelleme paketi oluşturduğunuzda, Visual Studio eski sürümleri asla otomatik silmez. Diskinizde sonsuza dek kalırlar.

Baş Şüpheli C: Global NuGet Paket Önbelleği (10 - 20+ GB)

%USERPROFILE%\.nuget\packages konumunda yer alan bu dizin, makinenize indirilmiş tüm NuGet paketlerinin her bir sürümünü saklar. Bir kütüphane 12.0.1'den 12.0.2'ye güncellendiğinde, eski sürüm elle temizlenene kadar diskinizde kalır.

Baş Şüpheli D: Windows Kullanıcı Geçici Dosyaları (Temp) (3 - 10 GB)

Derleme, paketleme ve sıkıştırma işlemleri sırasında Visual Studio ve MSBuild %LOCALAPPDATA%\Temp dizininde binlerce geçici dosya oluşturur. Aylarca süren çalışma sonrasında bu dosyalar devasa boyutlara ulaşır.


2. Güvenlik Garantisi: Neden %100 Risksizdir?

Geliştiricilerin dosya silme konusunda dikkatli olması son derece doğaldır. Neyin korunduğu ve neyin güvenle temizlenebileceğine dair katı kural şöyledir:

Korunan Unsurlar (ASLA Dokunulmaz) Güvenle Temizlenenler (%100 Geri Getirilebilir)
Kaynak Kodlar: .cs, .xaml, .cpp, .h, .ts, .json Ara derleyici nesne dosyaları (obj/)
Çözüm ve Proje Tanımları: .sln, .csproj, .wapproj Derlenmiş ikili çıktılar ve kopyalanan DLL'ler (bin/)
Git Depoları: .git/ klasörü, commit geçmişi, branch'ler Eski Microsoft Store yayın paketleri (AppPackages/)
Ham Asset Kaynakları: Dokular (.png), Sesler (.ogg), Shader'lar Global indirilmiş NuGet paketleri (.nuget\packages)
Sertifikalar ve Mağaza Bağlantıları: .pfx, StoreAssociation.xml Windows geçici çalışma dosyaları (%LOCALAPPDATA%\Temp)

Visual Studio'yu Yeniden Açtığınızda Ne Olur?
Projenizi açıp Build veya Rebuild yaptığınızda, Visual Studio ve .NET SDK kaynak kodlarınızdan obj/ ve bin/ klasörlerini en güncel halleriyle baştan oluşturur. NuGet eksik paketleri otomatik indirir. Hiçbir ilerleme veya ayar kaybetmezsiniz.


3. Otomatik Çözüm: Tek Tıkla Temizleme Betiği

Yüzlerce klasörü elle aramak yerine, her projede güvenle çalışabilen bağımsız bir PowerShell aracı ve Windows Batch başlatıcısı hazırladık.

Özellikler:

  1. Kök Sürücü Kilidi: Yanlışlıkla sistem kök sürücüsünün (C:\ gibi) taranmasını veya silinmesini kesinlikle engeller.
  2. Yalnızca Tarama Modu (-ScanOnly): Hiçbir dosyaya dokunmadan tam olarak kaç gigabayt kazanılacağını listeler.
  3. Güvenlik Onayı: Nelerin temizleneceğini net bir tabloyla gösterip kullanıcıdan onay (Y/N) ister.
  4. Kilitli Dosyaları Güvenle Atlama: Açık bir IDE veya işlem tarafından kullanılan dosyaları hata vermeden atlayarak çalışmaya devam eder.

PowerShell Temizleme Motoru (Clean-DevDiskSpace.ps1)

Bu betiği çalışma alanınızdaki bir araç klasörüne kaydedin (Örn: _tools/Clean-DevDiskSpace.ps1 veya scripts/Clean-DevDiskSpace.ps1):

<#
.SYNOPSIS
    Gelistirici Calisma Alani Disk Temizleme Araci.
.DESCRIPTION
    Projelerin 'bin' ve 'obj' klasorlerini, Microsoft Store MSIX AppPackages
    paketlerini, Windows Temp dosyalarini ve yerel NuGet paket onbellegini
    guvenle temizler. Kaynak kodlar, asset'ler ve Git gecmisi %100 korunur.
#>

[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 "GUVENLIK ENGELI: Hedef dizin kok surucu veya gecersiz! Islem iptal edildi." -ForegroundColor Red
    exit 1
}

$Host.UI.RawUI.WindowTitle = "Gelistirici Disk Temizleme Araci"

Write-Host "================================================================================" -ForegroundColor Cyan
Write-Host "                GELISTIRICI DISK ALANI TEMIZLEME ARACI                          " -ForegroundColor Cyan
Write-Host "================================================================================" -ForegroundColor Cyan
Write-Host "Hedef Calisma Dizini: $resolvedRoot" -ForegroundColor Yellow

function Get-FolderSizeInfo {
    param ([string]$Path)
    if (-not (Test-Path $Path)) { return @{ SizeMB = 0; SizeGB = 0; Count = 0 } }
    $measure = Get-ChildItem -Path $Path -Recurse -File -Force -ErrorAction SilentlyContinue |
               Measure-Object -Property Length -Sum
    $sum = if ($measure.Sum) { $measure.Sum } else { 0 }
    return @{
        SizeMB = [math]::Round($sum / 1MB, 2)
        SizeGB = [math]::Round($sum / 1GB, 2)
        Count  = $measure.Count
    }
}

$systemDrive = Get-PSDrive -Name C
$freeGBBefore = [math]::Round($systemDrive.Free / 1GB, 2)
Write-Host "`nC: Surucusunde Mevcut Bos Alan: $freeGBBefore GB`n" -ForegroundColor Yellow

Write-Host "[1/4] Projelerin 'bin' ve 'obj' derleme klasorleri taraniyor..." -ForegroundColor Green
$binObjDirs = Get-ChildItem -Path $resolvedRoot -Recurse -Directory -Force -ErrorAction SilentlyContinue |
              Where-Object { $_.Name -in @('bin', 'obj') }

$binObjTotalBytes = 0
$binObjCount = 0
foreach ($dir in $binObjDirs) {
    $m = (Get-ChildItem -Path $dir.FullName -Recurse -File -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum
    if ($m) { $binObjTotalBytes += $m }
    $binObjCount++
}
$binObjGB = [math]::Round($binObjTotalBytes / 1GB, 2)

Write-Host "[2/4] Microsoft Store / MSIX 'AppPackages' cikti klasorleri taraniyor..." -ForegroundColor Green
$appPackageDirs = Get-ChildItem -Path $resolvedRoot -Recurse -Directory -Filter "AppPackages" -Force -ErrorAction SilentlyContinue
$storeTotalBytes = 0
$storeCount = 0
foreach ($dir in $appPackageDirs) {
    $m = (Get-ChildItem -Path $dir.FullName -Recurse -File -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum
    if ($m) { $storeTotalBytes += $m }
    $storeCount++
}
$storeGB = [math]::Round($storeTotalBytes / 1GB, 2)

Write-Host "[3/4] Windows Temp klasoru hesaplaniyor..." -ForegroundColor Green
$tempPath = [System.IO.Path]::GetTempPath()
$tempInfo = if (-not $SkipTemp) { Get-FolderSizeInfo -Path $tempPath } else { @{ SizeGB = 0; Count = 0 } }

Write-Host "[4/4] Yerel NuGet paket onbellegi hesaplaniyor..." -ForegroundColor Green
$nugetCachePath = "$env:USERPROFILE\.nuget\packages"
$nugetInfo = if (-not $SkipNuget) { Get-FolderSizeInfo -Path $nugetCachePath } else { @{ SizeGB = 0; Count = 0 } }

$totalReclaimableGB = [math]::Round($binObjGB + $storeGB + $tempInfo.SizeGB + $nugetInfo.SizeGB, 2)

Write-Host "`n========================= BULUNAN TEMIZLENEBILIR ALANLAR =========================" -ForegroundColor Magenta
$scanSummary = @(
    [PSCustomObject]@{ Kategori = "Proje Derleme Artigi (bin/obj)"; KlasorSayisi = $binObjCount; KazanilicakAlan = "$binObjGB GB" },
    [PSCustomObject]@{ Kategori = "Microsoft Store Paketleri (AppPackages)"; KlasorSayisi = $storeCount; KazanilicakAlan = "$storeGB GB" },
    [PSCustomObject]@{ Kategori = "Windows Gecici Dosyalari (Temp)"; KlasorSayisi = $tempInfo.Count; KazanilicakAlan = "$($tempInfo.SizeGB) GB" },
    [PSCustomObject]@{ Kategori = "Yerel NuGet Paket Onbellegi"; KlasorSayisi = $nugetInfo.Count; KazanilicakAlan = "$($nugetInfo.SizeGB) GB" }
)
$scanSummary | Format-Table -AutoSize

Write-Host ">>> TOPLAM KAZANILACAK ALAN TAHMINI: $totalReclaimableGB GB <<<`n" -ForegroundColor Cyan

Write-Host "================================ GUVENLIK BILGISI ================================" -ForegroundColor Green
Write-Host "* Bu islem kaynak kodlarinizi (.cs, .xaml, .cpp, .json vb.) KESINLIKLE SILMEZ." -ForegroundColor White
Write-Host "* Proje ayarlariniza (.csproj, .sln) ve Git gecmisinize (.git) ASLA dokunulmaz." -ForegroundColor White
Write-Host "* Gorsel, ses ve diger oyun asset kaynaklariniz %100 korunur." -ForegroundColor White
Write-Host "* Silinen dosyalar yalnizca derleyicinin Build sirasinda yeniden uretecegi araclardir." -ForegroundColor White
Write-Host "==================================================================================`n" -ForegroundColor Green

if ($ScanOnly) {
    Write-Host "Tarama modu (-ScanOnly) tamamlandi. Hicbir dosya silinmedi." -ForegroundColor Yellow
    return
}

if (-not $Force) {
    $prompt = Read-Host "Temizlik islemini onayliyor musunuz? (Evet: Y / Hayir: N)"
    if ($prompt -notin @('Y', 'y', 'Evet', 'evet', 'E', 'e')) {
        Write-Host "Islem kullanici tarafindan iptal edildi." -ForegroundColor Yellow
        return
    }
}

Write-Host "`n>>> Temizleme islemi baslatiliyor... Lutfen bekleyiniz...`n" -ForegroundColor Cyan

# 1. bin ve obj silme
Write-Host "[1/4] 'bin' ve 'obj' klasorleri siliniyor..." -ForegroundColor Yellow
$deletedBinObj = 0
foreach ($dir in $binObjDirs) {
    try {
        if (Test-Path $dir.FullName) {
            Remove-Item -Path $dir.FullName -Recurse -Force -ErrorAction SilentlyContinue
            $deletedBinObj++
        }
    } catch {}
}
Write-Host "      $deletedBinObj adet derleme klasoru temizlendi." -ForegroundColor Gray

# 2. AppPackages silme
Write-Host "[2/4] 'AppPackages' Store cikti klasorleri siliniyor..." -ForegroundColor Yellow
$deletedAppPackages = 0
foreach ($dir in $appPackageDirs) {
    try {
        if (Test-Path $dir.FullName) {
            Remove-Item -Path $dir.FullName -Recurse -Force -ErrorAction SilentlyContinue
            $deletedAppPackages++
        }
    } catch {}
}
Write-Host "      $deletedAppPackages adet AppPackages klasoru temizlendi." -ForegroundColor Gray

# 3. Temp silme
if (-not $SkipTemp) {
    Write-Host "[3/4] Windows Temp dosyalari temizleniyor..." -ForegroundColor Yellow
    Get-ChildItem -Path $tempPath -Force -ErrorAction SilentlyContinue | ForEach-Object {
        try { Remove-Item -Path $_.FullName -Recurse -Force -ErrorAction SilentlyContinue } catch {}
    }
    Write-Host "      Temp klasoru temizlendi (kullanimdaki dosyalar guvenle atlandi)." -ForegroundColor Gray
}

# 4. NuGet silme
if (-not $SkipNuget) {
    Write-Host "[4/4] NuGet paket onbellegi temizleniyor..." -ForegroundColor Yellow
    try {
        $null = dotnet nuget locals all --clear 2>&1
        Write-Host "      NuGet onbellegi basariyla bosaltildi." -ForegroundColor Gray
    } catch {
        Write-Host "      NuGet onbellegi temizlenirken uyari: $_" -ForegroundColor DarkYellow
    }
}

$systemDriveAfter = Get-PSDrive -Name C
$freeGBAfter = [math]::Round($systemDriveAfter.Free / 1GB, 2)
$freedTotal = [math]::Round($freeGBAfter - $freeGBBefore, 2)

Write-Host "`n================================================================================" -ForegroundColor Green
Write-Host "                           TEMIZLIK TAMAMLANDI!                                 " -ForegroundColor Green
Write-Host "================================================================================" -ForegroundColor Green
Write-Host "Onceki Bos Alan    : $freeGBBefore GB" -ForegroundColor White
Write-Host "Yeni Bos Alan      : $freeGBAfter GB" -ForegroundColor Green
Write-Host "Kazanilan Toplam   : +$freedTotal GB" -ForegroundColor Cyan
Write-Host "================================================================================`n" -ForegroundColor Green

Tek Tıkla Başlatıcı (clean-disk-space.bat)

Bu .bat dosyasını projelerinizin bulunduğu ana dizine koymanız yeterlidir:

@echo off
setlocal
title Gelistirici Disk Alani Temizleyici
cd /d "%~dp0"

echo =======================================================================
echo          Gelistirici Disk Alani Temizleme Baslaticisi
echo =======================================================================
echo.

powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0_tools\Clean-DevDiskSpace.ps1" %*

echo.
echo Islem tamamlandi. Cikmak icin bir tusa basiniz...
pause >nul

4. Gerçek Saha Testi Sonuçları: Öncesi ve Sonrası

Oyun motoru, mobil projeler ve masaüstü yazılımları içeren çoklu bir çalışma dizininde yapılan gerçek test sonuçları:

========================= BULUNAN TEMIZLENEBILIR ALANLAR =========================

Kategori                                       KlasorSayisi KazanilicakAlan
--------                                       ------------ ---------------
Proje Derleme Artigi (bin/obj)                          300        52.79 GB
Microsoft Store Paketleri (AppPackages)                   2         2.92 GB
Windows Gecici Dosyalari (Temp)                       11248         3.56 GB
Yerel NuGet Paket Onbellegi                           36055         9.33 GB

>>> TOPLAM KAZANILACAK ALAN TAHMINI: 68.60 GB <<<

================================================================================
                           TEMIZLIK TAMAMLANDI!                                 
================================================================================
Onceki Bos Alan    : 1.35 GB
Yeni Bos Alan      : 53.80 GB
Kazanilan Toplam   : +52.45 GB
================================================================================

3 dakikadan kısa sürede diske tam 52.45 GB net kullanılabilir SSD alanı geri kazandırıldı. Hiçbir program silmeden veya tek bir satır kod riske atmadan sistem tamamen rahatlatıldı.


5. Geliştiriciler İçin SSD Bakım Tavsiyeleri

  1. Her Büyük Mağaza Dağıtımından Sonra Temizleyin:
    .msixupload paketiniz Microsoft Partner Center veya Google Play Console tarafından onaylandıktan sonra yerel AppPackages klasörünü silin. Eski sürümler gerekirse Git etiketlerinden her zaman tekrar üretilebilir.
  2. Ayda Bir Rutin Olarak Çalıştırın:
    clean-disk-space.bat dosyasına ayda bir çift tıklayarak onlarca gigabaytlık birikmeyi engelleyin.
  3. .gitignore Yapınızı Sıkı Tutun:
    Kök .gitignore dosyanızda [Bb]in/, [Oo]bj/, AppPackages/ ve *.msixupload kurallarının bulunduğundan emin olun.

Depolama alanınızı verimli kullanın, bilgisayarınızı hızlı tutun ve keyifli kodlamalar!


Arar Games Hakkında ve Oyunlarımız

Oyunlarımızı keşfedin ve stüdyomuzu takip edin:

🎮 Oyunlarımız

📱 Resmi Sosyal Medya Kanallarımız




Hiç yorum yok:

Yorum Gönder