<p>Bonjour,</p>
<p>Ce problème de suppression lente de nombreux petits fichiers est extrêmement courant et bien documenté. Avec des dizaines de milliers de fichiers JPEG de 20 Ko, vous touchez à une limitation fondamentale du système de fichiers <strong>NTFS</strong> couplée au comportement de l’Explorateur Windows. Voici l’analyse complète et les solutions pour accélérer drastiquement vos suppressions.</p>
<h2><a name="p-34527-pourquoi-windows-10-est-lent-supprimer-de-nombreux-petits-fichiers-1" class="anchor" href="#p-34527-pourquoi-windows-10-est-lent-supprimer-de-nombreux-petits-fichiers-1" aria-label="Heading link"></a>Pourquoi Windows 10 est lent à supprimer de nombreux petits fichiers</h2>
<h3><a name="p-34527-h-1-le-problme-de-la-corbeille-2" class="anchor" href="#p-34527-h-1-le-problme-de-la-corbeille-2" aria-label="Heading link"></a>1. Le problème de la Corbeille</h3>
<p>Par défaut, l’Explorateur Windows déplace les fichiers dans la <strong>Corbeille</strong> avant de les supprimer. Pour des dizaines de milliers de fichiers, cela implique :</p>
<ul>
<li>Calcul de la taille totale (opération séquentielle sur chaque fichier)</li>
<li>Déplacement métadonnées par métadonnées vers <code>$Recycle.Bin</code></li>
<li>Mise à jour du Master File Table (MFT) pour chaque entrée</li>
</ul>
<p>Cette opération est <strong>O(n)</strong> — linéaire par rapport au nombre de fichiers — et génère énormément d’opérations d’I/O aléatoires, ce qui est très pénalisant même sur SSD.</p>
<h3><a name="p-34527-h-2-la-fragmentation-du-mft-sur-disque-dur-hdd-3" class="anchor" href="#p-34527-h-2-la-fragmentation-du-mft-sur-disque-dur-hdd-3" aria-label="Heading link"></a>2. La fragmentation du MFT sur disque dur (HDD)</h3>
<p>Si vous travaillez sur un <strong>disque dur traditionnel</strong> (HDD), les têtes de lecture doivent se déplacer physiquement pour mettre à jour chaque entrée MFT. Avec 50 000 fichiers, cela représente des milliers de déplacements mécaniques.</p>
<h3><a name="p-34527-h-3-les-notifications-de-changement-du-systme-de-fichiers-4" class="anchor" href="#p-34527-h-3-les-notifications-de-changement-du-systme-de-fichiers-4" aria-label="Heading link"></a>3. Les notifications de changement du système de fichiers</h3>
<p>Windows 10 émet des <strong>notifications USN Journal</strong> pour chaque modification du système de fichiers. Ces notifications sont consommées par l’Indexeur de recherche Windows, le service de synchronisation OneDrive, les antivirus, et d’autres services. Chaque suppression déclenche une cascade d’opérations secondaires.</p>
<h3><a name="p-34527-h-4-lantivirus-en-temps-rel-5" class="anchor" href="#p-34527-h-4-lantivirus-en-temps-rel-5" aria-label="Heading link"></a>4. L’antivirus en temps réel</h3>
<p>Les solutions antivirus comme <strong>Windows Defender</strong> (ou tout autre antivirus tiers) interceptent chaque opération sur un fichier, y compris la suppression. Pour 50 000 fichiers JPEG, cela multiplie le temps par un facteur significatif.</p>
<h2><a name="p-34527-solutions-classes-par-ordre-defficacit-6" class="anchor" href="#p-34527-solutions-classes-par-ordre-defficacit-6" aria-label="Heading link"></a>Solutions classées par ordre d’efficacité</h2>
<h3><a name="p-34527-solution-1-utiliser-la-commande-del-avec-suppression-directe-bypass-corbeille-7" class="anchor" href="#p-34527-solution-1-utiliser-la-commande-del-avec-suppression-directe-bypass-corbeille-7" aria-label="Heading link"></a>Solution 1 : Utiliser la commande <code>del</code> avec suppression directe (bypass Corbeille)</h3>
<p>La méthode la plus rapide pour supprimer de nombreux petits fichiers est d’utiliser l’invite de commandes <strong>en contournant la Corbeille</strong> :</p>
<pre data-code-wrap="cmd"><code class="lang-cmd">REM Supprimer tous les .jpg dans un dossier (sans confirmation, sans corbeille)
del /f /q "C:\chemin\vers\dossier*.jpg"
REM Supprimer récursivement dans tous les sous-dossiers
del /f /q /s "C:\chemin\vers\dossier*.jpg"
REM Supprimer un dossier entier et tout son contenu
rmdir /s /q "C:\chemin\vers\dossier"
</code></pre>
<p>Le flag <code>/f</code> force la suppression des fichiers en lecture seule, <code>/q</code> désactive les confirmations. <strong><code>rmdir /s /q</code></strong> est généralement la méthode la plus rapide pour supprimer un dossier complet.</p>
<h3><a name="p-34527-solution-2-powershell-avec-suppression-parallle-8" class="anchor" href="#p-34527-solution-2-powershell-avec-suppression-parallle-8" aria-label="Heading link"></a>Solution 2 : PowerShell avec suppression parallèle</h3>
<p>PowerShell permet d’exploiter plusieurs threads pour les suppressions :</p>
<pre data-code-wrap="powershell"><code class="lang-powershell"># Suppression rapide sans corbeille
Remove-Item -Path "C:\chemin\vers\dossier*" -Recurse -Force
Suppression parallèle (PowerShell 7+ recommandé)
Get-ChildItem -Path "C:\chemin\vers\dossier" -Filter "*.jpg" -Recurse |
ForEach-Object -Parallel { Remove-Item $_.FullName -Force } -ThrottleLimit 8
Pour un dossier entier : la méthode la plus rapide
[System.IO.Directory]:😃elete("C:\chemin\vers\dossier", $true)
</code></pre>
<p>La dernière méthode utilisant <code>[System.IO.Directory]:😃elete</code> appelle directement l’API .NET et est souvent <strong>2 à 5 fois plus rapide</strong> que <code>Remove-Item</code>.</p>
<h3><a name="p-34527-solution-3-dsactiver-temporairement-lindexation-et-lantivirus-9" class="anchor" href="#p-34527-solution-3-dsactiver-temporairement-lindexation-et-lantivirus-9" aria-label="Heading link"></a>Solution 3 : Désactiver temporairement l’indexation et l’antivirus</h3>
<pre data-code-wrap="powershell"><code class="lang-powershell"># Désactiver Windows Search (indexeur) pendant la suppression
Stop-Service -Name "WSearch" -Force
Write-Host "Indexeur arrêté — procédez à la suppression maintenant"
Réactiver après suppression
Start-Service -Name "WSearch"
</code></pre>
<p>Pour <strong>Windows Defender</strong>, ajoutez le dossier en exclusion <strong>temporaire</strong> avant de supprimer :</p>
<pre data-code-wrap="powershell"><code class="lang-powershell"># Ajouter une exclusion temporaire
Add-MpPreference -ExclusionPath "C:\chemin\vers\dossier"
Supprimer l'exclusion après la suppression
Remove-MpPreference -ExclusionPath "C:\chemin\vers\dossier"
</code></pre>
<blockquote>
<p><strong>Avertissement :</strong> Ne laissez pas une exclusion antivirus active sur un dossier de production.</p>
</blockquote>
<h3><a name="p-34527-solution-4-outil-robocopy-miroir-dun-dossier-vide-10" class="anchor" href="#p-34527-solution-4-outil-robocopy-miroir-dun-dossier-vide-10" aria-label="Heading link"></a>Solution 4 : Outil RoboCopy (miroir d’un dossier vide)</h3>
<p>Une technique très efficace pour supprimer de nombreux fichiers est de <strong>“miroir”</strong> un dossier vide sur le dossier cible avec RoboCopy :</p>
<pre data-code-wrap="cmd"><code class="lang-cmd">REM Créer un dossier vide temporaire
mkdir C:\DossierVide
REM Utiliser RoboCopy pour vider le dossier cible ultra-rapidement
robocopy C:\DossierVide "C:\chemin\vers\dossier" /MIR /MT:16
REM Supprimer ensuite le dossier lui-même
rmdir /s /q "C:\chemin\vers\dossier"
</code></pre>
<p><code>/MIR</code> synchronise en miroir (supprime tout ce qui n’est pas dans la source), <code>/MT:16</code> utilise 16 threads en parallèle. Cette méthode peut être <strong>10 à 20 fois plus rapide</strong> que la suppression via l’Explorateur pour des milliers de fichiers.</p>
<h2><a name="p-34527-comparatif-des-mthodes-11" class="anchor" href="#p-34527-comparatif-des-mthodes-11" aria-label="Heading link"></a>Comparatif des méthodes</h2>
<div class="md-table">
<table>
<thead>
<tr>
<th>Méthode</th>
<th>Vitesse relative</th>
<th>Complexité</th>
<th>Risque</th>
</tr>
</thead>
<tbody>
<tr>
<td>Explorateur Windows (Corbeille)</td>
<td>Très lente (référence)</td>
<td>Nulle</td>
<td>Nulle</td>
</tr>
<tr>
<td><code>del /f /q</code></td>
<td>3-5x plus rapide</td>
<td>Faible</td>
<td>Faible</td>
</tr>
<tr>
<td><code>rmdir /s /q</code></td>
<td>5-10x plus rapide</td>
<td>Faible</td>
<td>Faible</td>
</tr>
<tr>
<td>PowerShell <code>[IO.Directory]:😃elete</code></td>
<td>5-10x plus rapide</td>
<td>Faible</td>
<td>Faible</td>
</tr>
<tr>
<td>RoboCopy <code>/MIR /MT:16</code></td>
<td>10-20x plus rapide</td>
<td>Modérée</td>
<td>Modérée</td>
</tr>
<tr>
<td>RoboCopy + désactivation indexeur</td>
<td>15-30x plus rapide</td>
<td>Modérée</td>
<td>Faible</td>
</tr>
</tbody>
</table>
</div><h2><a name="p-34527-recommandations-pour-votre-workflow-habituel-12" class="anchor" href="#p-34527-recommandations-pour-votre-workflow-habituel-12" aria-label="Heading link"></a>Recommandations pour votre workflow habituel</h2>
<p>Puisque vous traitez régulièrement des lots de dizaines de milliers de JPEG, voici un script PowerShell réutilisable :</p>
<pre data-code-wrap="powershell"><code class="lang-powershell"># Script de suppression rapide d'un lot de fichiers JPEG
param(
[Parameter(Mandatory=$true)]
[string]$DossierCible
)
Write-Host "Préparation de la suppression rapide de : $DossierCible"
Arrêter l'indexeur temporairement
$indexeur = Get-Service -Name "WSearch" -ErrorAction SilentlyContinue
if ($indexeur -and $indexeur.Status -eq "Running") {
Stop-Service -Name "WSearch" -Force
$indexeurActif = $true
Write-Host "Indexeur Windows Search arrêté"
}
Supprimer via l'API .NET directement
$chrono = [System.Diagnostics.Stopwatch]::StartNew()
try {
[System.IO.Directory]:😃elete($DossierCible, $true)
Write-Host "Suppression terminée en $($chrono.Elapsed.TotalSeconds) secondes"
} finally {
Toujours réactiver l'indexeur
if ($indexeurActif) {
Start-Service -Name "WSearch"
Write-Host "Indexeur Windows Search redémarré"
}
}
</code></pre>
<p>Utilisez ce script avec : <code>.\suppression_rapide.ps1 -DossierCible "C:\lot_jpeg_ancien"</code></p>
<h2><a name="p-34527-impact-du-type-de-stockage-13" class="anchor" href="#p-34527-impact-du-type-de-stockage-13" aria-label="Heading link"></a>Impact du type de stockage</h2>
<div class="md-table">
<table>
<thead>
<tr>
<th>Type de stockage</th>
<th>Comportement sur petits fichiers</th>
<th>Conseil</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>HDD (disque dur)</strong></td>
<td>Très lent (I/O aléatoires pénalisants)</td>
<td>RoboCopy /MT indispensable</td>
</tr>
<tr>
<td><strong>SSD SATA</strong></td>
<td>Modéré</td>
<td>del ou rmdir suffisants</td>
</tr>
<tr>
<td><strong>SSD NVMe</strong></td>
<td>Rapide mais limité par NTFS</td>
<td>[IO.Directory]:😃elete optimal</td>
</tr>
<tr>
<td><strong>Réseau (NAS/SMB)</strong></td>
<td>Très lent (latence par fichier)</td>
<td>RoboCopy avec /MT</td>
</tr>
</tbody>
</table>
</div><p>Si vous travaillez fréquemment avec ce type de lots, envisagez également de placer vos dossiers de travail temporaires sur un volume <strong>ReFS</strong> (Resilient File System) qui gère beaucoup mieux les opérations sur grand nombre de petits fichiers que NTFS.</p>
<p>N’hésitez pas à préciser votre type de stockage et le nombre exact de fichiers par lot pour affiner les recommandations.</p>
<hr>
<p><em>Ayi NEDJIMI — Consultant IT & Microsoft</em><br>
<em>Pour un accompagnement personnalisé : <a href="https://ayinedjimi-consultants.fr">ayinedjimi-consultants.fr</a></em></p>