50-100 GB Speicherplatz zurückgewinnen: Der ultimative Bereinigungsleitfaden für .NET-, Game- und Desktop-Entwickler
Jeder Software- und Spieleentwickler unter Windows kennt diesen Tag: Man startet den Rechner, öffnet Visual Studio und plötzlich meldet das Betriebssystem, dass auf der 1-TB-NVMe-SSD weniger als 2 GB freier Speicher verbleiben.
Weder wurden riesige Videos heruntergeladen, noch neue Spiele installiert. Wohin ist der gesamte Speicherplatz verschwunden?
Als Indie-Game- und Cross-Platform-Entwickler mit .NET 8/9, MonoGame, Android und Windows Application Packaging (MSIX/WAP für Microsoft Store) bin ich diesem Speicherproblem auf den Grund gegangen. Eine automatisierte Analyse der Entwicklungsverzeichnisse zeigte: Über 68 GB wurden allein durch Build-Artefakte, alte Store-Paketarchive und globale NuGet-Caches belegt.
Dieser Leitfaden erklärt die Ursachen für diesen Speicherverbrauch, warum das Löschen dieser Verzeichnisse zu 100 % sicher ist, und liefert fertige PowerShell- und Batch-Skripte für eine vollautomatische Bereinigung.
1. Die Ursachen für Speicherfresser in Entwicklerumgebungen
Beim Kompilieren moderner Multiplattform-Lösungen vervielfachen Compiler und Packaging-Tools Zwischenstände und Binärdateien:
flowchart TD
subgraph "Projekt-Arbeitsbereich"
Code["Quellcode (.cs, .xaml, .json)\n(Geschützt - Wenige MBs)"]
Assets["Assets (PNG, OGG, Shader)\n(Geschützt)"]
Git[".git-Verlauf\n(Geschützt)"]
BinObj["bin & obj Ordner\n(Zwischen-DLLs, Symbole, Kopien)\n[30 - 60 GB]"]
AppPackages["WAP / MSIX AppPackages\n(Historische .msixbundle, .msixupload)\n[5 - 20 GB]"]
end
subgraph "System- & Globale Caches"
NuGet["%USERPROFILE%\\.nuget\\packages\n(Globaler NuGet-Cache)\n[10 - 20 GB]"]
Temp["%LOCALAPPDATA%\\Temp\n(Compiler-Temporärdateien)\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
Verursacher A: bin- und obj-Ordner (30 - 60+ GB)
Jedes C#-Projekt erzeugt bei der Kompilierung:
obj/(Zwischenausgabe): Enthält inkrementelle Build-Zustände und plattformspezifische Zwischenschritte. Bei Android-Zielplattformen wachsen diese Verzeichnisse pro Projekt rasch auf 3 bis 6 GB an.bin/(Binärausgabe): Beinhaltet fertige Assemblies und kopierte Asset-Dateien. Referenzieren 10 Projekte einen gemeinsamen Content-Ordner von 500 MB, wird dieser 10-mal dupliziert (5 GB unnötiger Verbrauch).
Verursacher B: Microsoft Store AppPackages (5 - 20+ GB)
Wer Desktop-Spiele oder -Apps via WAP-Projekt für den Microsoft Store verpackt, erhält im Ordner AppPackages vollständige .msixbundle- und .msixupload-Dateien inklusive PDB-Debugging-Symbolen. Visual Studio löscht ältere Versionen niemals automatisch.
Verursacher C: Globaler NuGet-Cache (10 - 20+ GB)
Unter %USERPROFILE%\.nuget\packages speichert Windows jede jemals heruntergeladene Paketversion ab. Ohne manuelle Bereinigung bleibt jede veraltete Version dauerhaft auf der Festplatte.
Verursacher D: Windows-Temp-Dateien (3 - 10 GB)
Unter %LOCALAPPDATA%\Temp häufen sich über Monate hinweg Tausende temporäre Compiler-Dateien an.
2. Sicherheitsgarantie: Warum das Löschen risikofrei ist
| Geschützt (Wird NIEMALS gelöscht) | Sicher zu löschen (100 % regenerierbar) |
|---|---|
Quellcode: .cs, .xaml, .cpp, .json etc. |
Compiler-Zwischenobjekte (obj/) |
Projektdateien: .sln, .csproj, .wapproj |
Kompilierte Binärdateien (bin/) |
Git-Repositories: .git/-Ordner, Branches, Commits |
Alte Store-Upload-Pakete (AppPackages/) |
| Roh-Assets: Texturen, Sounds, Modelle | Heruntergeladene NuGet-Pakete (.nuget\packages) |
Zertifikate: .pfx, StoreAssociation.xml |
Windows-Temporärdateien (%LOCALAPPDATA%\Temp) |
Was geschieht beim nächsten Öffnen von Visual Studio?
Beim Klick auf Build oder Rebuild erzeugen Compiler und SDK diebin- undobj-Verzeichnisse automatisch neu. NuGet stellt fehlende Pakete während des Restores selbstständig wieder her.
3. Die Automatisierungslösung: Bereinigung per Klick
Mit dem nachfolgenden PowerShell-Skript (_tools/Clean-DevDiskSpace.ps1) und der Batch-Datei lassen sich Projekte sicher bereinigen:
<#
.SYNOPSIS
Entwickler-Festplattenbereinigungstool.
#>
[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 "SICHERHEITSABBRUCH: Ungültiger oder Root-Pfad!" -ForegroundColor Red
exit 1
}
$systemDrive = Get-PSDrive -Name C
$freeGBBefore = [math]::Round($systemDrive.Free / 1GB, 2)
Write-Host "Freier Speicher vor Bereinigung: $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 "Scan-Modus beendet." -ForegroundColor Yellow; return }
if (-not $Force) {
$prompt = Read-Host "Bereinigung starten? (J/N)"
if ($prompt -notin @('J', 'j', '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 "`nBEREINIGUNG ERFOLGREICH! Zurückgewonnen: +$freedTotal GB" -ForegroundColor Green
Batch-Starter (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. Reale Testergebnisse: Von 1,35 GB auf 53,80 GB
- Vorher: 1,35 GB freier Speicher (kritischer Zustand)
- Nachher: 53,80 GB freier Speicher
- Effektiver Gewinn: +52,45 GB in unter drei Minuten.
5. Empfehlungen zur Wartung
- Nach jedem Store-Release den lokalen Ordner
AppPackagesleeren. - Einmal im Monat die Bereinigung durchführen.
- Die
.gitignore-Regeln fürbin/,obj/undAppPackages/stets aktuell halten.
Über Arar Games & Unsere Spiele
Entdecke unsere Indie-Spiele und folge unserem Studio:
- 🌐 Offizielle Website: https://www.mayhemcorporation.com
🎮 Unsere Spiele
- Blocked: Pixel Panzer: Retro-Arcade-Panzerkampf mit dynamischem Wetter & Bosskämpfen.
Google Play (Android & PC) - PaintTrek: Farbenfrohe Rätsel und Pixel-Mal-Action.
Google Play | Microsoft Store (PC & Xbox) - Space Dodger: Rasante Retro-Arcade-Weltraum-Ausweichaction.
Google Play
📱 Folge unserem Studio
- 🎵 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