27 Ekim 2026 Salı

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




Hiç yorum yok:

Yorum Gönder