Odzyskaj 50-100 GB: Kompletny przewodnik po czyszczeniu dysku dla programistów .NET, gier i aplikacji desktopowych
Każdy programista pracujący w systemie Windows prędzej czy później spotyka się z tym samym problemem: uruchamiasz komputer, włączasz środowisko programistyczne i nagle Windows informuje, że na dysku SSD NVMe o pojemności 1 TB zostało mniej niż 2 GB wolnego miejsca.
Nie pobierałeś filmów w 4K ani nie instalowałeś nowych gier o wadze 100 GB. Gdzie podziała się cała przestrzeń?
Jako niezależny twórca gier i aplikacji desktopowych pracujący z .NET 8/9, MonoGame, Androidem oraz Windows Application Packaging (MSIX/WAP dla Microsoft Store) postanowiłem to zbadać. Automatyczne skanowanie repozytoriów projektowych wykazało, że ponad 68 GB zajmowały tymczasowe pliki kompilacji, archiwa starych pakietów instalacyjnych oraz globalna pamięć podręczna NuGet.
W tym przewodniku wyjaśniamy, dlaczego środowiska deweloperskie pochłaniają tak ogromne ilości pamięci, dlaczego usuwanie tych folderów jest w 100% bezpieczne, oraz udostępniamy gotowe skrypty PowerShell i Batch do natychmiastowego zwolnienia dziesiątek gigabajtów.
1. Skąd bierze się zapełnienie dysku programisty?
Podczas kompilacji rozwiązań wieloplatformowych narzędzia deweloperskie duplikują biblioteki i zasoby na każdym etapie:
flowchart TD
subgraph "Przestrzeń robocza projektów"
Code["Kod źródłowy (.cs, .xaml, .json)\n(Chroniony - Kilka MB)"]
Assets["Oryginalne zasoby (PNG, OGG, Shaders)\n(Chronione)"]
Git["Historia .git\n(Chroniona)"]
BinObj["Foldery bin i obj\n(Pośrednie DLL, symbole, kopie)\n[30 - 60 GB]"]
AppPackages["WAP / MSIX AppPackages\n(Stare pakiety sklepu)\n[5 - 20 GB]"]
end
subgraph "Pamięci podręczne systemu"
NuGet["%USERPROFILE%\\.nuget\\packages\n(Globalny cache NuGet)\n[10 - 20 GB]"]
Temp["%LOCALAPPDATA%\\Temp\n(Tymczasowe pliki kompilatora)\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
Przyczyna A: Foldery bin i obj (30 - 60+ GB)
obj/(Wyniki pośrednie): Przechowuje stany kompilacji przyrostowej. Dla projektów Android folder ten potrafi osiągnąć 3 do 6 GB na jeden projekt.bin/(Pliki binarne): Zawiera gotowe pliki wykonywalne i zasoby powielone za pomocą<CopyToOutputDirectory>. Jeśli 10 projektów odwołuje się do wspólnego folderu z zawartością gry o wielkości 500 MB, dane te są powielane 10 razy (5 GB niepotrzebnie zajętego miejsca).
Przyczyna B: Foldery AppPackages ze sklepu Microsoft Store (5 - 20+ GB)
Podczas generowania paczek instalacyjnych Visual Studio tworzy pliki .msixbundle oraz .msixupload (z pełnymi symbolami PDB). Środowisko nigdy automatycznie nie kasuje starszych wersji.
Przyczyna C: Globalny cache NuGet (10 - 20+ GB)
W %USERPROFILE%\.nuget\packages przechowywana jest każda wersja każdej biblioteki kiedykolwiek pobranej na Twoim komputerze.
Przyczyna D: Pliki tymczasowe Windows (Temp) (3 - 10 GB)
W katalogu %LOCALAPPDATA%\Temp kompilatory i instalatory pozostawiają tysiące porzuconych plików roboczych.
2. Gwarancja bezpieczeństwa: Dlaczego to w 100% bezpieczne?
| Chronione (NIGDY nieusuwane) | Bezpieczne do usunięcia (100% odtwarzalne) |
|---|---|
Kod źródłowy: .cs, .xaml, .cpp, .json |
Pliki obiektowe kompilatora (obj/) |
Definicje projektów: .sln, .csproj, .wapproj |
Skompilowane pliki wykonywalne i DLL (bin/) |
Repozytoria Git: Folder .git/, gałęzie i commity |
Stare pakiety wydań sklepowych (AppPackages/) |
| Oryginalne zasoby: Grafiki, dźwięki, shadery | Pobrane pakiety NuGet (.nuget\packages) |
Certyfikaty: .pfx, StoreAssociation.xml |
Pliki tymczasowe systemu (%LOCALAPPDATA%\Temp) |
Co się stanie po ponownym otwarciu Visual Studio?
Wystarczy otworzyć projekt i kliknąć Kompiluj (Build) lub Przebuduj (Rebuild). Narzędzia SDK i kompilator automatycznie odtworzą strukturę folderówbiniobjz Twojego kodu źródłowego. Żadne dane ani ustawienia nie zostaną utracone.
3. Zautomatyzowane rozwiązanie: Skrypt czyszczący
Silnik PowerShell (Clean-DevDiskSpace.ps1)
Zapisz skrypt w _tools/Clean-DevDiskSpace.ps1 w katalogu swoich projektów:
<#
.SYNOPSIS
Narzędzie do czyszczenia dysku dla programistów
#>
[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 "BLOKADA BEZPIECZEŃSTWA: Wykryto ścieżkę główną dysku!" -ForegroundColor Red
exit 1
}
$systemDrive = Get-PSDrive -Name C
$freeGBBefore = [math]::Round($systemDrive.Free / 1GB, 2)
Write-Host "Wolne miejsce na dysku C przed czyszczeniem: $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 "Skanowanie zakończone." -ForegroundColor Yellow; return }
if (-not $Force) {
$prompt = Read-Host "Czy chcesz rozpocząć bezpieczne czyszczenie? (T/N)"
if ($prompt -notin @('T', 't', '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 "`nCZYSZCZENIE ZAKOŃCZONE! Odzyskano: +$freedTotal GB" -ForegroundColor Green
Plik wsadowy (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. Rzeczywiste wyniki testów
- Wolne miejsce przed czyszczeniem: 1,35 GB (Stan krytyczny)
- Wolne miejsce po czyszczeniu: 53,80 GB
- Odzyskana przestrzeń: +52,45 GB w mniej niż 3 minuty.
O Arar Games i naszych grach
Odkryj nasze gry niezależne i śledź nasze studio:
- 🌐 Oficjalna strona internetowa: https://www.mayhemcorporation.com
🎮 Nasze gry
- Blocked: Pixel Panzer: Walki czołgów retro arcade z dynamiczną pogodą i pojedynkami z bossami.
Google Play (Android i PC) - PaintTrek: Kolorowe łamigłówki i pikselowe malowanie.
Google Play | Microsoft Store (PC i Xbox) - Space Dodger: Dynamiczna gra zręcznościowa polegająca na omijaniu przeszkód w kosmosie.
Google Play
📱 Oficjalne media społecznościowe
- 🎵 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