Une fois, en décompressant un zip, je me suis retrouvé avec plus de 200 000 fichiers et 50 000 dossiers (environ). Impossible de supprimer le dossier avec l'explorateur windows, qui plantait au bout d'un trop grand nombre de fichiers. J'ai donc fait ce programme qui liste les fichiers contenus dans le dossier, les supprime, liste les sous-dossiers, les supprime puis enfin supprime le dossier.
Source / Exemple :
'Pour un souci d'utilisateur, ce programme avait d'abord été fait pour supprimer les fichiers
'au premier plan. L'utilisateur moyen se met à cliquer partout dès qu'il attend trop longtemps
'et plante le programme.
'Maintenant, la suppression ET le scan se font en arrière-plan, pour ne pas perturber notre
'utilisateur moyen...
'Voici uniquement le "noyau" du code
''' <summary>
''' Dossier à scanner et a supprimer
''' </summary>
Private CurrentFolder As String
''' <summary>
''' Liste des fichiers du dossier courant
''' </summary>
Private CurrentFilesArray() As String
''' <summary>
''' Liste des sous-dossiers du dossier courant
''' </summary>
Private CurrentFoldersArray() As String
''' <summary>
''' True si il faut supprimer le dossier, sinon False
''' </summary>
Private DeleteDirectory As Boolean
''' <summary>
''' Le nombre de fichiers qui n'ont pas pu être supprimés
''' </summary>
Private FilesCannotDelete As Integer
''' <summary>
''' Nombre de dossiers qui n'ont pas pu être supprimés
''' </summary>
''' <remarks></remarks>
Private FoldersCannotDelete As Integer
Private Sub MainWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles MainWorker.DoWork
'On supprime d'abord les fichiers
For i As Integer = 0 To CurrentFilesArray.Length - 1
If MainWorker.CancellationPending = True Then e.Cancel = True
If File.Exists(CurrentFilesArray(i)) = True Then 'Si le fichier existe toujours
Try
File.Delete(CurrentFilesArray(i)) 'On le supprime
Catch ex As Exception
FilesCannotDelete += 1 'Ah ben zut ! Un fichier de plus qu'on a pas pu supprimer
End Try
End If
MainWorker.ReportProgress(i) 'On n'arrête pas le progrès
Next
'Puis on supprime les sous-dossiers
For i As Integer = 0 To CurrentFoldersArray.Length - 1
If MainWorker.CancellationPending = True Then e.Cancel = True
If Directory.Exists(CurrentFoldersArray(i)) = True Then 'Si le dossier existe toujours
Try
Directory.Delete(CurrentFoldersArray(i), True) 'On le supprime et si il contient des sous-dossiers, poubelle aussi
Catch ex As Exception
FoldersCannotDelete += 1 'Ah ben zut ! Un dossier de plus qu'on a pas pu supprimer
End Try
End If
MainWorker.ReportProgress(i + CurrentFilesArray.Length) 'On n'arrêtera jamais le progrès
Next
If DeleteDirectory = True Then Directory.Delete(CurrentFolder) 'Si demandé, on supprime le dossier
End Sub
Conclusion :
Une utilisation des tableaux plutôt que des collections et un travail en arrière-plan assurent une application rapide sans plantage.
Pour avoir le fichier exe, il faut renommer le fichier "Files Remover.file" en .exe
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.