Files remover - supprimer un grand nombre de fichiers

Description

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

Codes Sources

A voir également

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.