Files remover - supprimer un grand nombre de fichiers

Soyez le premier à donner votre avis sur cette source.

Vue 7 316 fois - Téléchargée 424 fois

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

Ajouter un commentaire

Commentaires

cs_eldim
Messages postés
956
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
21 août 2014
1 -
bonjour,
manque juste le changement d'attribut avant la suppression sinon les fichiers en lecture seul ne sont pas supprimés normalement
cs_Vince300
Messages postés
11
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
16 mars 2010
-
Bonjour

Merci pour ce conseil. Effectivement, je débute avec le BackgroundWorker donc je ne connaissais pas cette propriété.

@+
jmenfous
Messages postés
117
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
2 juillet 2009
-
Pardon j'ai fais vite fais mon exemple avec Visual Studio et je n'ai pas pansé à changer le nom de mon BackGroubdWorker:
If Me.MainWorker.CancellationPending Then
e.Cancel = True
return
End If
jmenfous
Messages postés
117
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
2 juillet 2009
-
Bonjour,

Peut être pourais tu utiliser un peu plus ton backgroudworker MainWorker avec l'annulation de l'opération en cours.

Je m'explique : Effectivement, tu utilises la méthode CancelAsync() de MainWorker. Mais sans mettre de code controllant la propriété CancellationPending de MainWorker, celà ne sert à rien.

Pour faire simple : passes MainWorker.WorkerSupportsCancellation à True
et dans ta méthode MainWorker_DoWork ajoutes dans chaque boucle le code suivant :
If Me.backgroundWorker1.CancellationPending Then
e.Cancel = True
return
End If

Comme celà si il y a demande d'annulation, il y aura bien un arret de ton job en cours.

En espérant que celà te soit utile.

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.