27 Ekim 2026 Salı

استعادة 50-100 جيجابايت: الدليل الشامل لتنظيف مساحة القرص لمطوري .NET والألعاب وتطبيقات سطح المكتب




استعادة 50-100 جيجابايت: الدليل الشامل لتنظيف مساحة القرص لمطوري .NET والألعاب وتطبيقات سطح المكتب

يواجه كل مطور برمجيات وألعاب على نظام Windows صباحًا حرجًا في نهاية المطاف: تشغّل جهازك، تفتح بيئة التطوير، وإذ بنظام Windows يعرض تحذيرًا عاجلًا—بقي أقل من 2 جيجابايت من المساحة الفارغة على محرك أقراص SSD بحجم 1 تيرابايت.

لم تقم بتنزيل مقاطع فيديو ضخمة، ولم تثبت ألعابًا جديدة بحجم 100 جيجابايت. إلى أين ذهبت كل هذه المساحة التخزينية؟

بصفتي مطور ألعاب مستقلة وتطبيقات سطح مكتب متعددة المنصات باستخدام .NET 8/9 و MonoGame و Android وحزم MSIX/WAP لمتجر Microsoft، قمت بفحص هذه الأزمة الصامتة. أظهر الفحص الآلي لمجلدات المشاريع أن أكثر من 68 جيجابايت كانت مشغولة بالكامل بنواتج البناء المؤقتة، وحزم المتاجر القديمة، وذاكرة التخزين المؤقت لحزم NuGet.

في هذا الدليل، نوضح الأسباب المعمارية لهذا التضخم، ونبين لماذا يعد حذف هذه المجلدات آمنًا بنسبة 100%، ونشارك نصوص PowerShell و Batch برمجية جاهزة لتفريغ عشرات الجيجابايت بنقرة واحدة.


1. أسباب تضخم مساحة التخزين لدى المطورين

عند بناء حلول برمجية تدعم منصات متعددة، تقوم أدوات البناء بمضاعفة الملفات الثنائية والوسائط في كل مرحلة:

flowchart TD
    subgraph "مساحة عمل المشروع"
        Code["الكود المصدري (.cs, .xaml, .json)\n(محمي - بضعة ميجابايت)"]
        Assets["الوسائط الأصلية (PNG, OGG, Shaders)\n(محمي)"]
        Git["سجل .git\n(محمي)"]
        
        BinObj["مجلدات bin و obj\n(ملفات DLL مؤقتة، رموز)\n[30 - 60 GB]"]
        AppPackages["WAP / MSIX AppPackages\n(حزم النشر القديمة)\n[5 - 20 GB]"]
    end

    subgraph "الذاكرة المؤقتة للنظام"
        NuGet["%USERPROFILE%\\.nuget\\packages\n(مخزن NuGet المؤقت)\n[10 - 20 GB]"]
        Temp["%LOCALAPPDATA%\\Temp\n(ملفات المترجم المؤقتة)\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

السبب الأول: مجلدات bin و obj (30 - 60+ جيجابايت)

  • obj/ (المخرجات الوسيطة): تحتوي على حالات التجميع المتزايدة ونواتج المنصات المؤقتة. بالنسبة لمشاريع Android، يمكن أن يصل حجم هذا المجلد إلى 3-6 جيجابايت لكل مشروع.
  • bin/ (المخرجات الثنائية): تحتوي على الملفات التنفيذية وكافة الوسائط المنسوخة عبر <CopyToOutputDirectory>. إذا كانت 10 مشاريع تشير إلى مجلد وسائط مشترك بحجم 500 ميجابايت، يتم تكرار نسخه 10 مرات (إهدار 5 جيجابايت في حل واحد).

السبب الثاني: مجلدات AppPackages لمتجر Microsoft (5 - 20+ جيجابايت)

عند إنشاء حزم للمتجر، ينشئ Visual Studio ملفات .msixbundle و .msixupload كاملة مع رموز PDB. ولا يقوم أبدًا بحذف الإصدارات القديمة تلقائيًا.

السبب الثالث: ذاكرة NuGet المؤقتة العامة (10 - 20+ جيجابايت)

في المسار %USERPROFILE%\.nuget\packages، يتم الاحتفاظ بكل إصدار من كل حزمة تم تنزيلها على جهازك على الإطلاق.

السبب الرابع: ملفات Windows المؤقتة (Temp) (3 - 10 جيجابايت)

آلاف الملفات المؤقتة التي تتركها أدوات التجميع والضغط في المسار %LOCALAPPDATA%\Temp.


2. ضمان الأمان: لماذا العملية خالية من المخاطر بنسبة 100%؟

ملفات محمية (لا تُمس أبدًا) ملفات يمكن حذفها بأمان (تُعاد صياغتها بالكامل)
الكود المصدري: .cs, .xaml, .cpp, .json ملفات الكائنات المؤقتة للمترجم (obj/)
تعريفات المشاريع: .sln, .csproj, .wapproj الملفات الثنائية ومكتبات DLL المجمعة (bin/)
مستودعات Git: مجلد .git/ والفروع والالتزامات حزم إصدارات المتجر السابقة (AppPackages/)
الوسائط الأصلية: الصور والأصوات والمجسمات حزم NuGet المخزنة محليًا (.nuget\packages)
الشهادات: .pfx, StoreAssociation.xml ملفات النظام المؤقتة (%LOCALAPPDATA%\Temp)

ماذا يحدث عند إعادة فتح Visual Studio؟
بمجرد فتح الحل والضغط على Build أو Rebuild، يعيد Visual Studio و .NET SDK إنشاء مجلدات bin و obj فورًا من الكود المصدري. لا تفقد أي سطر كود أو إعدادات.


3. الحل البرمجي التلقائي: نصوص التنظيف

محرك PowerShell للتنظيف (Clean-DevDiskSpace.ps1)

<#
.SYNOPSIS
    أداة تنظيف مساحة القرص للمطورين
#>
[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 "خطأ أمان: تم الكشف عن مسار الجذر!" -ForegroundColor Red
    exit 1
}

$systemDrive = Get-PSDrive -Name C
$freeGBBefore = [math]::Round($systemDrive.Free / 1GB, 2)
Write-Host "المساحة الفارغة قبل التنظيف: $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 "اكتمل الفحص." -ForegroundColor Yellow; return }
if (-not $Force) {
    $prompt = Read-Host "هل تريد بدء التنظيف الآمن؟ (Y/N)"
    if ($prompt -notin @('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 "`nاكتمل التنظيف! المساحة المستعادة: +$freedTotal GB" -ForegroundColor Green

ملف التشغيل المباشر (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. نتائج الاختبار الميداني: من 1.35 إلى 53.80 جيجابايت

  • المساحة الفارغة قبل التنظيف: 1.35 جيجابايت (تحذير أحمر)
  • المساحة الفارغة بعد التنظيف: 53.80 جيجابايت
  • صافي المساحة المستعادة: +52.45 جيجابايت في أقل من 3 دقائق.

نبذة عن Arar Games وألعابنا

اكتشف ألعابنا المستقلة وتواصل مع الاستوديو:

🎮 ألعابنا

  • Blocked: Pixel Panzer: معارك دبابات آركيد كلاسيكية مع طقس ديناميكي ومواجهات زعماء ملحمية.
    Google Play (Android و PC)
  • PaintTrek: ألغاز ألوان نابضة بالحياة وحركة تلوين بكسل إبداعية.
    Google Play | Microsoft Store (PC و Xbox)
  • Space Dodger: لعبة تفادي عقبات فضائية سريعة الوتيرة لاختبار ردود الفعل.
    Google Play

📱 قنوات التواصل الاجتماعي الرسمية




Hiç yorum yok:

Yorum Gönder