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ğinnet9.0-windows10.0venet9.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.msixuploadve 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ızdanobj/vebin/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:
- 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. - Yalnızca Tarama Modu (
-ScanOnly): Hiçbir dosyaya dokunmadan tam olarak kaç gigabayt kazanılacağını listeler. - Güvenlik Onayı: Nelerin temizleneceğini net bir tabloyla gösterip kullanıcıdan onay (
Y/N) ister. - 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
- Her Büyük Mağaza Dağıtımından Sonra Temizleyin:
.msixuploadpaketiniz Microsoft Partner Center veya Google Play Console tarafından onaylandıktan sonra yerelAppPackagesklasörünü silin. Eski sürümler gerekirse Git etiketlerinden her zaman tekrar üretilebilir. - Ayda Bir Rutin Olarak Çalıştırın:
clean-disk-space.batdosyasına ayda bir çift tıklayarak onlarca gigabaytlık birikmeyi engelleyin. .gitignoreYapınızı Sıkı Tutun:
Kök.gitignoredosyanızda[Bb]in/,[Oo]bj/,AppPackages/ve*.msixuploadkuralları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:
- 🌐 Resmi Web Sitesi: https://www.mayhemcorporation.com
🎮 Oyunlarımız
- Blocked: Pixel Panzer: Retro piksel tank savaşı, renk çarkı mekaniği ve boss mücadeleleri.
Google Play (Android ve PC) - PaintTrek: Canlı renkler, yaratıcı bulmacalar ve akıcı piksel boyama deneyimi.
Google Play | Microsoft Store (PC ve Xbox) - Space Dodger: Uzayın derinliklerinde refleks gerektiren yüksek tempolu retro arcade engellerden kaçış oyunu.
Google Play
📱 Resmi Sosyal Medya Kanallarımız
- 🎵 TikTok: https://www.tiktok.com/@arargamesstudio
- 📸 Instagram: https://www.instagram.com/arargamesstudio
- 🐦 X (Twitter): https://x.com/arargamesstudio
- 📺 YouTube: https://www.youtube.com/@koreaaria
- 🧵 Threads: https://www.threads.net/@arargamesstudio
- 📘 Facebook: https://www.facebook.com/arargamesstudio
Hiç yorum yok:
Yorum Gönder