27 Ekim 2026 Salı

50-100 GB Speicherplatz zurückgewinnen: Der ultimative Bereinigungsleitfaden für .NET-, Game- und Desktop-Entwickler




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 die bin- und obj-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

  1. Nach jedem Store-Release den lokalen Ordner AppPackages leeren.
  2. Einmal im Monat die Bereinigung durchführen.
  3. Die .gitignore-Regeln für bin/, obj/ und AppPackages/ stets aktuell halten.

Über Arar Games & Unsere Spiele

Entdecke unsere Indie-Spiele und folge unserem Studio:

🎮 Unsere Spiele

📱 Folge unserem Studio




Hiç yorum yok:

Yorum Gönder