alucard02
Messages postés26Date d'inscriptionmardi 6 novembre 2007StatutMembreDernière intervention30 janvier 2009 18 déc. 2007 à 19:40
c'est exactement ce que je cherchais...
Merci
victor110
Messages postés86Date d'inscriptionvendredi 20 octobre 2006StatutMembreDernière intervention13 mai 2010 24 nov. 2006 à 18:02
On peut aussi utiliser la fonction
DELETE ds VB
Bonne @ prog!!!
forchi
Messages postés33Date d'inscriptionlundi 21 juin 2004StatutMembreDernière intervention24 mai 2008 3 nov. 2006 à 13:48
Pour info
Ceux qui sont sous .net:
Dim Dir As New DirectoryInfo("Chemin de mon dossier a supprimer")
Dir.Delete(True)
cs_PaTaTe
Messages postés2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 25 mai 2006 à 18:40
Problème résolu comme indiqué dans le message CS
La fonction tourne correctement. :)
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 25 mai 2006 à 12:57
Je vous envoie un message CS avec mon adresse e-Mail de manière à ce que vous puissiez m'envoyer l'arborescence posant le problème compressée en 7z ou autre.
Ainsi, je pourrai certainement reproduire le problème et y trouver une solution...
P.S. : Pour la mise en cache, c'est pareil chez moi, mais la plupart des gens la laissent active...
P.P.S. : J'aimerais vraiment savoir si ce sont des dossiers ou des fichiers qui posent le problème, mais également si l'explorateur Windows était ouvert sur le dossier ou un des sous-dossiers (cela pose parfois problème, cfr. limitations) lors de l'exécution de la fonction.
Bonne prog. !
cs_PaTaTe
Messages postés2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 25 mai 2006 à 12:05
Pour le test de la fonction j'ai utilisé un projet effectivement vide et j'ai créé des dossiers et fichiers vides pour tester. Donc je n'etais pas dans un repertoire temporaire sujet à des accès qui pourrait effectivement expliquer le probleme.
Pour les fichiers Thumbs.db, cela n'est pas le problème puisque mise en cache des medias est chez moi tout simplement désactivée donc aucuns de ces fichiers ne peut fausser le déroulement de la fonction.
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 25 mai 2006 à 11:11
Pardonnez-moi, mais le comportement de cette fonction est tout sauf aléatoire !
En mode fichiers vides seulement, elle réalise ceci :
1. Pour chaque dossier, elle génère une liste des dossiers et fichiers que le répertoire contient.
2. Elle traite chaque élément de la liste constituée (pas d'interruption si échec) :
a. Si c'est un dossier elle s'appelle récursivement pour ce répertoire et effectue le même traitement.
b. Si c'est un fichier et que celui-ci a une taille de 0 octet, il est supprimé.
Vous pouvez facilement vérifier son fonctionnement :
1. Créez un nouveau dossier.
2. Placez-y des fichiers vides et non-vides.
3. Placez-y des sous-dossiers (Créez-en des nouveaux).
4. Pour chaque sous-dossier, appliquez la même procédure avec des variantes, afin de traiter tous les cas possibles.
5. Effectuez cela jusqu'à obtenir des arborescences de tailles variables de 5 niveaux au moins (sinon c'est trop facile).
ATTENTION : N'y mettez aucune image ou vidéo pour ne pas fausser les résultats ! L'explication de cette remarque vient juste après...
Je suppose que ce que vous entendez par comportement aléatoire, c'est que certains dossiers qui sont pourtant "vides" (j'insiste sur les guillements) ne sont pas supprimés, alors que d'autres ne posent aucun problème !
Si c'est bien le cas, je suppose également qu'à un moment ou à un autre ce dossier a contenu des images et/ou vidéos. Ouvrez l'"Explorateur Windows", Cliquez sur le menu "Outils", puis sur "Options des dossiers...". Allez dans l'onglet "Affichage". Vérifiez dans les "Paramètres avancés" qu'"Afficher les fichiers et dossiers cachés" est bien activé et surtout que "Masquer les fichiers protégés du système d'exploitation (recommandé)" est bien décoché (vous devrez confirmer en cliquant sur "Oui") ! Ouvrez un des dossiers "vide" qui n'a pas été supprimé par la fonction. Vous devriez y voir un fichier "Thumbs.db" qui n'est pas vide. C'est un fichier système caché qui sert à stocker les miniatures sous Windows 2000/XP. Il peut il y en avoir d'autres selon le dossier...
Si un fichier est apparu avec le changement de configuration, il est tout à fait normal que la fonction n'aie pas supprimé le dossier (vu qu'il n'est pas vraiment vide).
Pour pallier à ce problème, vous pouvez évidemment rajouter un test sur le nom du fichier "Thumbs.db".
Voilà,
Sans plus de détails sur ce que vous essayez de supprimer, je ne peux faire plus.
Je ne dis pas qu'il ne peut pas il y avoir de bug (l'erreur est humaine), mais je n'ai pas pu reproduire de phénomène de comportement aléatoire... Peut-être qu'avec plus d'informations, je pourrais reproduire le problème...
Bonne programmation !
cs_PaTaTe
Messages postés2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 25 mai 2006 à 08:55
C'est la fonction que je voulait mais apparemment sont comportement est aléatoire.
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 24 mai 2006 à 20:47
Etrange, la modification fonctionne comme prévu chez moi !
Peut-être n'ai-je pas été assez clair dans mes explications... Il est également possible que je n'aie pas compris ce que vous vouliez...
Quoi qu'il en soit, j'ai posté une nouvelle version avec les modifications supposées désirées...
Si ce n'est pas encore cela, dites-m'en plus sur votre objectif (exemple concret), cher PaTaTe.
Bonne programmation !
cs_PaTaTe
Messages postés2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 24 mai 2006 à 09:23
Apparement cette modification ne fonctionne pas :(
Je regarderais ça en détail dès que j'aurais 5 minutes.
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 24 mai 2006 à 08:19
Cher PaTaTe,
Pour obtenir le résultat escompté, il suffit d'effectuer les modifications suivantes :
1. Partir de la deuxième version de la fonction.
2. Remplacer : Public Function SupprimeRépertoire(Répertoire As String) As Boolean
Par : Public Function SupprimeRépertoire(Répertoire As String, Optional ByVal FichiersVidesSeulement As Boolean = False) As Boolean
' On s'assure que le fichier n'est pas en lecture seule.
SetAttr Val, vbReadOnly = 0
' On supprime le fichier.
Kill (Val)
Par :
If (Not FichiersVidesSeulement) Then
' On s'assure que le fichier n'est pas en lecture seule.
SetAttr Val, vbReadOnly = 0
' On supprime le fichier.
Kill (Val)
Else
If (FileLen(Val) = 0) Then
' On s'assure que le fichier n'est pas en lecture seule.
SetAttr Val, vbReadOnly = 0
' On supprime le fichier.
Kill (Val)
End If
End If
5. Veiller à passer True dans l'appel de la fonction.
C'est tout !
Bonne programmation !
cs_PaTaTe
Messages postés2126Date d'inscriptionmercredi 21 août 2002StatutContributeurDernière intervention19 février 20212 23 mai 2006 à 11:53
pourquoi ne pas mettre en paramètres optionel ne supprimer que les répertoire vide / ou ceux qui contiennent que des fichiers de 0 octets ?
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 29 mai 2005 à 23:04
Rien de plus simple à faire, mkos2005 !
1. Tu crées un nouveau module dans ton projet.
2. Tu copies le code d'une des 2 versions de la fonction ci-dessus (selon tes besoins).
3. Tu colles le code en question dans le module.
4. Au niveau de la procédure de traitement d'un clic sur un bouton, ou ailleurs dans ton code, tu appelles la fonction comme suit : SupprimeRépertoire("C:\LeRépertoireASupprimer")
Tu peux, bien entendu, tester la valeur renvoyée par la fonction si tu en as besoin.
Voilà !
Bonne prog !!!
Matyouz
Messages postés28Date d'inscriptiondimanche 27 mars 2005StatutMembreDernière intervention27 juillet 2011 5 mai 2005 à 17:37
ok ! ça marche impeccable ... merci pour ta réponse rapide !
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 5 mai 2005 à 17:17
Tout à fait normal que cela ne fonctionne pas avec ce que tu passes en paramètre, Matyouz.
Mets plutôt ceci : "C:\Nouveau".
Ainsi, ça ira !
Je te conseille vivement, pour t'assurer qu'il y a bien un backslash à la fin du chemin de ton répertoire, d'utiliser une fonction du genre :
Public Function AddBackSlashIfNecessary(Directory As String)
If Right(Directory, 1) <> "" Then
Directory = Directory & ""
End If
AddBackSlashIfNecessary = Directory
End Function
Pour ce qui est de vbDirectory, c'est une constante. Elle désigne un répertoire. La ligne en question permet de déterminer si l'élément du système de fichier désigné par le chemin complet est un répertoire ou non.
Je fais cela à l'aide d'un opérateur "Et" binaire.
Exemple :
00010110
Et 00010000
-------------
00010000
Si le bit est positionné, c'est que c'est bien un répertoire et la valeur sera égale à la constante vbDirectory.
cfr. MSDN : Dir, fonction et And, opérateur.
Voilà !
J'espère avoir été assez clair.
Bonne prog !
Matyouz
Messages postés28Date d'inscriptiondimanche 27 mars 2005StatutMembreDernière intervention27 juillet 2011 5 mai 2005 à 16:32
Erreur d'execution 53 "Fichier introuvable .... sur cette ligne : If (GetAttr(Répertoire & SousRépertoireOuFichier) And vbDirectory) = vbDirectory Then
J'envoie "c:\Nouveau" à cette fonction compilée dans un module ... le programme plante alors que ce répertoire existe bien !!!
Que veux dire cette ligne exactement ? vbDirectory contient la valeur 16 ... ça veut dire quoi ??
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 23 janv. 2005 à 09:33
Ta solution ne saurait convenir, trouble magma.
Si un fichier est en cours d'exécution ou verrouillé par un programme, il ne pourra de toute façon pas être supprimé ! On n'est pas sous UNIX (là, c'est possible). De plus, supposer que l'unique fichier qui pose problème est "Index.dat" est beaucoup trop restrictif.
La seule possibilité, c'est de passer les fichiers ou les dossiers qui ne sont pas supprimables.
Cette opération était impossible avec la première version de ma fonction.
La seconde version apporte une solution au vidage des dossiers temporaires.
Bonne prog @ tous et à toutes !
P.S. : Je n'ai pas pu répondre plus tôt, par manque de temps. Désolé ! Là, je fais une petite pause avant de me remettre à étudier... C'est vous dire ce que je fais de mes loisirs ;-)...
trouble magma
Messages postés15Date d'inscriptionmercredi 8 septembre 2004StatutMembreDernière intervention11 août 2005 10 déc. 2004 à 08:56
j'imagine que si au lieu de :
Kill (Répertoire & SousRépertoire)
tu mets :
if SousRépertoire = "Index.dat" then
Kill (Répertoire & SousRépertoire)
end if
ca devrait marcher......
almey
Messages postés48Date d'inscriptionsamedi 19 avril 2003StatutMembreDernière intervention 2 mai 2006 8 mai 2004 à 12:05
Salut ...
Je trouve ta fonction excellente ... mais juste un petit problème ...
Je souhaite m'en servir notament pour vider le dossier TEMP, TEMPORY INTERNET FILES ... mais ta fonction réalise une boucle infini sur le fichier Index.dat (Fichier que l'on ne peut pas supprimer)
Aurais-tu une solution à ce problème ??
Merci ...
almey
Messages postés48Date d'inscriptionsamedi 19 avril 2003StatutMembreDernière intervention 2 mai 2006 8 mai 2004 à 12:05
Salut ...
Je trouve ta fonction excellente ... mais juste un petit problème ...
Je souhaite m'en servir notament pour vider le dossier TEMP, TEMPORY INTERNET FILES ... mais ta fonction réalise une boucle infini sur le fichier Index.dat (Fichier que l'on ne peut pas supprimer)
Aurais-tu une solution à ce problème ??
Merci ...
tlsosiris
Messages postés24Date d'inscriptiondimanche 18 avril 2004StatutMembreDernière intervention14 mai 2004 5 mai 2004 à 19:02
salut a tous si y'a bien un truc qui m'enerve c bien qu'on expilque rien sur les sources, pensez aux newbies bordel.
Par exemple je le place ou la fonction, je l'appel command, je met quoi ds la form, etc...
Sinon merci pour toute ces sources tres instructives.
Ps : a l'avenir commentai vos sources ;p
Osiris : au dela du possible
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 15 nov. 2003 à 22:11
No problemo !!!
Je t'envoie un petit exemple !
neoburne
Messages postés2Date d'inscriptionsamedi 15 novembre 2003StatutMembreDernière intervention15 novembre 2003 15 nov. 2003 à 21:55
Bah en fait, la je suis perdu.
J'ai bien insérer ton code, avec la fonction SupprRépertoire, avec l'appel de la fonction dans le pgm principal, seulement, il ne m'efface rien.
En fait, je veux que lorsque j'ouvre un .exe de vb, il me supprime le dossier que j'ai sélectionné auparavant.
Alors, j'ai insérer mon pgm pricipal dans Private Sub Form_Load(), et l'appel à la fonction. Mais cela ne marche pas.
Pourrais-tu m'aider s'il te plaît ?
Merci !!!!!
Neoburn
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 15 nov. 2003 à 19:40
Salut neoburne !!!
En fait, il n'y a rien de plus simple à mettre en oeuvre !!!
Tu ajoutes un nouveau module et tu y colles le code de la fonction ci-dessus. (Tu peux également le copier/coller directement dans le code de ta fenêtre, mais c'est moins "modulaire" !!!)
Ensuite, dans le code de ta fenêtre (au niveau d'un clic sur un bouton ou autre), tu appelles la fonction de cette manière :
SupprimeRépertoire("C:Temp")
Voilà, j'espère avoir répondu à ta question !!!
Bonne continuation neoburne !!!!!
neoburne
Messages postés2Date d'inscriptionsamedi 15 novembre 2003StatutMembreDernière intervention15 novembre 2003 15 nov. 2003 à 18:57
Salut c néo
Bah en fait, je ne vois pas du tout comment est qu'elle se compile sous VB. Je sais que c'est une fonction et qu'il faut l'appeler sous le pgm principal, mais je me demander comment on y fait appel ds le pgm. Est ce qu'on pourait me donner un coup de main? ou de pied mm ??? LOL
MERCI
BONNE PROG
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 5 sept. 2003 à 10:29
Une version améliorée de cette fonction (SupprimeRépertoire) est incluse dans T.C.E.D.I. Direct Update Version 1.0.0.0 ! Si cela vous intéresse, rendez-vous sur cette page : http://www.vbfrance.com/article.aspx?Val=8416 Vous pouvez également vous rendre sur le site Web officiel de la T.C.E.D.I. : http://www.tcedi.be.tf
Bonne prog à tous !!!
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 5 sept. 2003 à 10:22
Merci magicdibot !
Le principal, c'est que ma source puisse servir à d'autres ! C'est pour cela que je l'ai postée sur VBFrance !
Bonne prog !
magicdibot
Messages postés10Date d'inscriptionmercredi 18 décembre 2002StatutMembreDernière intervention28 mars 2005 4 sept. 2003 à 23:08
Nickel.. pil poil ce que je cherchais... lol
Merci bi1.... en + en récursif.. j aime -)
SuperTonic
Messages postés53Date d'inscriptionmercredi 24 juillet 2002StatutMembreDernière intervention16 mars 2011 22 août 2003 à 10:44
Ok, je vais essayer. Le truc c'est que je ne peux en aucun cas supprimer le dossier origine (serveur/droits) .
je vais donc voir de plus pret ton exemple. Merci vraiement bcp
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 22 août 2003 à 10:27
Merci SuperTonic !!!
Pour faire ce que vous voulez (supprimer tous les sous-dossiers et fichiers, mais pas le répertoire lui-même), il y a de nombreuses possibilités !
Solution la plus simple : Juste après l'appel de la fonction, recréer le répertoire. (Bon ! Là, après avoir supprimé le dit répertoire, on le recrée, mais c'est ce qu'il y a de plus simple !)
Exemple :
Dim Chemin As String
Chemin="C:Temp"
SupprimeRépertoire(Chemin)
MkDir(Chemin)
Autre solution : Faire un copier/coller de la fonction, la renommer en SuppRep ou autre, laisser les appels à SupprimeRépertoire, et supprimer les 2 lignes après loop.
Au lieu d'appeler SupprimeRépertoire pour effectuer la suppression du dossier, il suffit d'appeler SuppRep, et le tour est joué !
Exemple :
Public Function SuppRep(Répertoire As String) As Boolean
On Error GoTo Erreur
Dim SousRépertoire As String
Dim Val As String
SousRépertoire = Dir(Répertoire, vbDirectory + vbHidden + vbSystem + vbArchive)
Do While SousRépertoire <> ""
If SousRépertoire <> "." And SousRépertoire <> ".." Then
If (GetAttr(Répertoire & SousRépertoire) And vbDirectory) = vbDirectory Then
SupprimeRépertoire (Répertoire & SousRépertoire & "")
Else
Val = Répertoire & SousRépertoire
SetAttr Val, vbReadOnly = 0
Kill (Répertoire & SousRépertoire)
End If
End If
SousRépertoire = Dir(Répertoire, vbDirectory + vbHidden + vbSystem + vbArchive)
If SousRépertoire = "." Then
SousRépertoire = Dir
End If
If SousRépertoire = ".." Then
SousRépertoire = Dir
End If
Loop
SuppRep = True
Exit Function
Erreur:
SuppRep = False
End Function
Voilà ! Il y a plein d'autres solutions, mais je m'arrête là !
Bonne prog !!!
SuperTonic
Messages postés53Date d'inscriptionmercredi 24 juillet 2002StatutMembreDernière intervention16 mars 2011 21 août 2003 à 16:37
Super la source ... Mais comment qu'on fait si on ne veux pas que le répertoire racine soit effacer. (Juste tous les fichiers et ss répertoires) ?
Merki
cs_Rock
Messages postés43Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention31 mai 2006 3 avril 2003 à 12:39
magnifique juste ce dont j avais besoin encore merci
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 31 déc. 2002 à 16:34
C'est vrai Sirocooo, on peut procéder comme cela !!! Cependant, deltree n'existe plus sous Windows 2000, XP. Là, il faut utiliser "rmdir /q /s". Ma fonction tourne sous les différentes versions de Windows. Je trouve que c'est un petit peu plus pratique.
Bonne prog !
Sirocooo
Messages postés412Date d'inscriptionmercredi 19 décembre 2001StatutMembreDernière intervention 7 avril 20081 31 déc. 2002 à 14:04
on peut aussi utiliser la command dos DELTREE et dans ce cas
il n'y à plus que 3 lignes de code
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 30 déc. 2002 à 13:47
Je suis tout à fait d'accord avec toi, SupraDolph !!! Il faut montrer les différentes manières d'effectuer une même opération. Et, laisser le choix aux développeurs de suivre telle ou telle méthode.
P.S. : Active un peu les heuristiques Bloodhound de ton Norton AntiVirus 2002 au niveau de protection maximal et teste ton code avec le FSO. Normalement, il devrait réagir !!!
Bonne prog !!!
SupraDolph
Messages postés196Date d'inscriptionsamedi 12 janvier 2002StatutMembreDernière intervention 1 septembre 20081 30 déc. 2002 à 13:28
il est peut être possible qu'un bon antivirus le détecte mais avec norton 2002 je n'est pas de pb.
après moi je donne ce source a titre d'exemple pour que l'on puisse comparer +ieur source. Je trouve qu'il est bien d'avoir le choix entre 2 (voir +) sources
SupraDolph
cs_shaoni
Messages postés186Date d'inscriptionmercredi 11 avril 2001StatutMembreDernière intervention12 septembre 2007 30 déc. 2002 à 08:42
de plus avec fso l'utilisateur est obliger d'avoir wsh installer !! encore des soucis en plus ! !
au moin il y a de dependance au mieux ! c'est !
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 30 déc. 2002 à 07:55
C'est vrai qu'il est possible d'utiliser le FSO et que c'est plus simple ! Cependant, si tu utilises le FSO pour supprimer un répertoire avec un bon AntiVirus, ce dernier va te signaler que ton programme exécute peut-être un script malveillant et il va te demander si tu désires l'autoriser à exécuter ce script ou non. Cela prend du temps. Et en général, ça ne plait pas aux utilisateurs finaux d'avoir l'impression de se faire hacker à chaque fois qu'ils utilisent ton programme ! lol !
Merci pour tes commentaires SupraDolph !
Bonne prog !!!
SupraDolph
Messages postés196Date d'inscriptionsamedi 12 janvier 2002StatutMembreDernière intervention 1 septembre 20081 30 déc. 2002 à 00:55
oups sa ne prend pas les backslash
Public Function SupprimeRepertoire(Repertoire As String)
If Right(Repertoire, 1) "BACKSLASH" Then Repertoire Left(Repertoire, Len(Repertoire) - 1)
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
fs.DeleteFile Repertoire & "BACKSLASH*.*", True
fs.DeleteFolder Repertoire, False
End Function
Bon Prog
SupraDolph
SupraDolph
Messages postés196Date d'inscriptionsamedi 12 janvier 2002StatutMembreDernière intervention 1 septembre 20081 30 déc. 2002 à 00:43
C pa mal mais, Personellement j'utiliserai plutôt :
Public Function SupprimeRepertoire(Repertoire As String)
If Right(Repertoire, 1) "" Then Repertoire Left(Repertoire, Len(Repertoire) - 1)
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
fs.DeleteFile Repertoire & "*.*", True
fs.DeleteFolder Repertoire, False
End Function
Bon Prog
SupraDolph
tcedi
Messages postés59Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 septembre 2003 29 déc. 2002 à 23:32
Mais, de rien, LordBob !!! J'espère que cette source te servira bien !
Bonne prog !
cs_LordBob
Messages postés2865Date d'inscriptionsamedi 2 novembre 2002StatutMembreDernière intervention11 mai 20099 29 déc. 2002 à 23:24
exactement la source ke je chercher, un grand merci a toi tcedi
18 déc. 2007 à 19:40
Merci
24 nov. 2006 à 18:02
DELETE ds VB
Bonne @ prog!!!
3 nov. 2006 à 13:48
Ceux qui sont sous .net:
Dim Dir As New DirectoryInfo("Chemin de mon dossier a supprimer")
Dir.Delete(True)
25 mai 2006 à 18:40
La fonction tourne correctement. :)
25 mai 2006 à 12:57
Ainsi, je pourrai certainement reproduire le problème et y trouver une solution...
P.S. : Pour la mise en cache, c'est pareil chez moi, mais la plupart des gens la laissent active...
P.P.S. : J'aimerais vraiment savoir si ce sont des dossiers ou des fichiers qui posent le problème, mais également si l'explorateur Windows était ouvert sur le dossier ou un des sous-dossiers (cela pose parfois problème, cfr. limitations) lors de l'exécution de la fonction.
Bonne prog. !
25 mai 2006 à 12:05
Pour les fichiers Thumbs.db, cela n'est pas le problème puisque mise en cache des medias est chez moi tout simplement désactivée donc aucuns de ces fichiers ne peut fausser le déroulement de la fonction.
25 mai 2006 à 11:11
En mode fichiers vides seulement, elle réalise ceci :
1. Pour chaque dossier, elle génère une liste des dossiers et fichiers que le répertoire contient.
2. Elle traite chaque élément de la liste constituée (pas d'interruption si échec) :
a. Si c'est un dossier elle s'appelle récursivement pour ce répertoire et effectue le même traitement.
b. Si c'est un fichier et que celui-ci a une taille de 0 octet, il est supprimé.
Vous pouvez facilement vérifier son fonctionnement :
1. Créez un nouveau dossier.
2. Placez-y des fichiers vides et non-vides.
3. Placez-y des sous-dossiers (Créez-en des nouveaux).
4. Pour chaque sous-dossier, appliquez la même procédure avec des variantes, afin de traiter tous les cas possibles.
5. Effectuez cela jusqu'à obtenir des arborescences de tailles variables de 5 niveaux au moins (sinon c'est trop facile).
ATTENTION : N'y mettez aucune image ou vidéo pour ne pas fausser les résultats ! L'explication de cette remarque vient juste après...
Je suppose que ce que vous entendez par comportement aléatoire, c'est que certains dossiers qui sont pourtant "vides" (j'insiste sur les guillements) ne sont pas supprimés, alors que d'autres ne posent aucun problème !
Si c'est bien le cas, je suppose également qu'à un moment ou à un autre ce dossier a contenu des images et/ou vidéos. Ouvrez l'"Explorateur Windows", Cliquez sur le menu "Outils", puis sur "Options des dossiers...". Allez dans l'onglet "Affichage". Vérifiez dans les "Paramètres avancés" qu'"Afficher les fichiers et dossiers cachés" est bien activé et surtout que "Masquer les fichiers protégés du système d'exploitation (recommandé)" est bien décoché (vous devrez confirmer en cliquant sur "Oui") ! Ouvrez un des dossiers "vide" qui n'a pas été supprimé par la fonction. Vous devriez y voir un fichier "Thumbs.db" qui n'est pas vide. C'est un fichier système caché qui sert à stocker les miniatures sous Windows 2000/XP. Il peut il y en avoir d'autres selon le dossier...
Si un fichier est apparu avec le changement de configuration, il est tout à fait normal que la fonction n'aie pas supprimé le dossier (vu qu'il n'est pas vraiment vide).
Pour pallier à ce problème, vous pouvez évidemment rajouter un test sur le nom du fichier "Thumbs.db".
Voilà,
Sans plus de détails sur ce que vous essayez de supprimer, je ne peux faire plus.
Je ne dis pas qu'il ne peut pas il y avoir de bug (l'erreur est humaine), mais je n'ai pas pu reproduire de phénomène de comportement aléatoire... Peut-être qu'avec plus d'informations, je pourrais reproduire le problème...
Bonne programmation !
25 mai 2006 à 08:55
24 mai 2006 à 20:47
Peut-être n'ai-je pas été assez clair dans mes explications... Il est également possible que je n'aie pas compris ce que vous vouliez...
Quoi qu'il en soit, j'ai posté une nouvelle version avec les modifications supposées désirées...
Si ce n'est pas encore cela, dites-m'en plus sur votre objectif (exemple concret), cher PaTaTe.
Bonne programmation !
24 mai 2006 à 09:23
Je regarderais ça en détail dès que j'aurais 5 minutes.
24 mai 2006 à 08:19
Pour obtenir le résultat escompté, il suffit d'effectuer les modifications suivantes :
1. Partir de la deuxième version de la fonction.
2. Remplacer : Public Function SupprimeRépertoire(Répertoire As String) As Boolean
Par : Public Function SupprimeRépertoire(Répertoire As String, Optional ByVal FichiersVidesSeulement As Boolean = False) As Boolean
3. Remplacer l'appel récursif : SupprimeRépertoire (MyArray(J))
Par : SupprimeRépertoire MyArray(J), FichiersVidesSeulement
4. Remplacer le code de suppression de fichiers :
' On s'assure que le fichier n'est pas en lecture seule.
SetAttr Val, vbReadOnly = 0
' On supprime le fichier.
Kill (Val)
Par :
If (Not FichiersVidesSeulement) Then
' On s'assure que le fichier n'est pas en lecture seule.
SetAttr Val, vbReadOnly = 0
' On supprime le fichier.
Kill (Val)
Else
If (FileLen(Val) = 0) Then
' On s'assure que le fichier n'est pas en lecture seule.
SetAttr Val, vbReadOnly = 0
' On supprime le fichier.
Kill (Val)
End If
End If
5. Veiller à passer True dans l'appel de la fonction.
C'est tout !
Bonne programmation !
23 mai 2006 à 11:53
29 mai 2005 à 23:04
1. Tu crées un nouveau module dans ton projet.
2. Tu copies le code d'une des 2 versions de la fonction ci-dessus (selon tes besoins).
3. Tu colles le code en question dans le module.
4. Au niveau de la procédure de traitement d'un clic sur un bouton, ou ailleurs dans ton code, tu appelles la fonction comme suit : SupprimeRépertoire("C:\LeRépertoireASupprimer")
Tu peux, bien entendu, tester la valeur renvoyée par la fonction si tu en as besoin.
Voilà !
Bonne prog !!!
5 mai 2005 à 17:37
5 mai 2005 à 17:17
Mets plutôt ceci : "C:\Nouveau".
Ainsi, ça ira !
Je te conseille vivement, pour t'assurer qu'il y a bien un backslash à la fin du chemin de ton répertoire, d'utiliser une fonction du genre :
Public Function AddBackSlashIfNecessary(Directory As String)
If Right(Directory, 1) <> "" Then
Directory = Directory & ""
End If
AddBackSlashIfNecessary = Directory
End Function
Pour ce qui est de vbDirectory, c'est une constante. Elle désigne un répertoire. La ligne en question permet de déterminer si l'élément du système de fichier désigné par le chemin complet est un répertoire ou non.
Je fais cela à l'aide d'un opérateur "Et" binaire.
Exemple :
00010110
Et 00010000
-------------
00010000
Si le bit est positionné, c'est que c'est bien un répertoire et la valeur sera égale à la constante vbDirectory.
cfr. MSDN : Dir, fonction et And, opérateur.
Voilà !
J'espère avoir été assez clair.
Bonne prog !
5 mai 2005 à 16:32
J'envoie "c:\Nouveau" à cette fonction compilée dans un module ... le programme plante alors que ce répertoire existe bien !!!
Que veux dire cette ligne exactement ? vbDirectory contient la valeur 16 ... ça veut dire quoi ??
23 janv. 2005 à 09:33
Si un fichier est en cours d'exécution ou verrouillé par un programme, il ne pourra de toute façon pas être supprimé ! On n'est pas sous UNIX (là, c'est possible). De plus, supposer que l'unique fichier qui pose problème est "Index.dat" est beaucoup trop restrictif.
La seule possibilité, c'est de passer les fichiers ou les dossiers qui ne sont pas supprimables.
Cette opération était impossible avec la première version de ma fonction.
La seconde version apporte une solution au vidage des dossiers temporaires.
Bonne prog @ tous et à toutes !
P.S. : Je n'ai pas pu répondre plus tôt, par manque de temps. Désolé ! Là, je fais une petite pause avant de me remettre à étudier... C'est vous dire ce que je fais de mes loisirs ;-)...
10 déc. 2004 à 08:56
Kill (Répertoire & SousRépertoire)
tu mets :
if SousRépertoire = "Index.dat" then
Kill (Répertoire & SousRépertoire)
end if
ca devrait marcher......
8 mai 2004 à 12:05
Je trouve ta fonction excellente ... mais juste un petit problème ...
Je souhaite m'en servir notament pour vider le dossier TEMP, TEMPORY INTERNET FILES ... mais ta fonction réalise une boucle infini sur le fichier Index.dat (Fichier que l'on ne peut pas supprimer)
Aurais-tu une solution à ce problème ??
Merci ...
8 mai 2004 à 12:05
Je trouve ta fonction excellente ... mais juste un petit problème ...
Je souhaite m'en servir notament pour vider le dossier TEMP, TEMPORY INTERNET FILES ... mais ta fonction réalise une boucle infini sur le fichier Index.dat (Fichier que l'on ne peut pas supprimer)
Aurais-tu une solution à ce problème ??
Merci ...
5 mai 2004 à 19:02
Par exemple je le place ou la fonction, je l'appel command, je met quoi ds la form, etc...
Sinon merci pour toute ces sources tres instructives.
Ps : a l'avenir commentai vos sources ;p
Osiris : au dela du possible
15 nov. 2003 à 22:11
Je t'envoie un petit exemple !
15 nov. 2003 à 21:55
J'ai bien insérer ton code, avec la fonction SupprRépertoire, avec l'appel de la fonction dans le pgm principal, seulement, il ne m'efface rien.
En fait, je veux que lorsque j'ouvre un .exe de vb, il me supprime le dossier que j'ai sélectionné auparavant.
Alors, j'ai insérer mon pgm pricipal dans Private Sub Form_Load(), et l'appel à la fonction. Mais cela ne marche pas.
Pourrais-tu m'aider s'il te plaît ?
Merci !!!!!
Neoburn
15 nov. 2003 à 19:40
En fait, il n'y a rien de plus simple à mettre en oeuvre !!!
Tu ajoutes un nouveau module et tu y colles le code de la fonction ci-dessus. (Tu peux également le copier/coller directement dans le code de ta fenêtre, mais c'est moins "modulaire" !!!)
Ensuite, dans le code de ta fenêtre (au niveau d'un clic sur un bouton ou autre), tu appelles la fonction de cette manière :
SupprimeRépertoire("C:Temp")
Voilà, j'espère avoir répondu à ta question !!!
Bonne continuation neoburne !!!!!
15 nov. 2003 à 18:57
Bah en fait, je ne vois pas du tout comment est qu'elle se compile sous VB. Je sais que c'est une fonction et qu'il faut l'appeler sous le pgm principal, mais je me demander comment on y fait appel ds le pgm. Est ce qu'on pourait me donner un coup de main? ou de pied mm ??? LOL
MERCI
BONNE PROG
5 sept. 2003 à 10:29
Vous pouvez également vous rendre sur le site Web officiel de la T.C.E.D.I. : http://www.tcedi.be.tf
Bonne prog à tous !!!
5 sept. 2003 à 10:22
Le principal, c'est que ma source puisse servir à d'autres ! C'est pour cela que je l'ai postée sur VBFrance !
Bonne prog !
4 sept. 2003 à 23:08
Merci bi1.... en + en récursif.. j aime -)
22 août 2003 à 10:44
je vais donc voir de plus pret ton exemple. Merci vraiement bcp
22 août 2003 à 10:27
Pour faire ce que vous voulez (supprimer tous les sous-dossiers et fichiers, mais pas le répertoire lui-même), il y a de nombreuses possibilités !
Solution la plus simple : Juste après l'appel de la fonction, recréer le répertoire. (Bon ! Là, après avoir supprimé le dit répertoire, on le recrée, mais c'est ce qu'il y a de plus simple !)
Exemple :
Dim Chemin As String
Chemin="C:Temp"
SupprimeRépertoire(Chemin)
MkDir(Chemin)
Autre solution : Faire un copier/coller de la fonction, la renommer en SuppRep ou autre, laisser les appels à SupprimeRépertoire, et supprimer les 2 lignes après loop.
Au lieu d'appeler SupprimeRépertoire pour effectuer la suppression du dossier, il suffit d'appeler SuppRep, et le tour est joué !
Exemple :
Public Function SuppRep(Répertoire As String) As Boolean
On Error GoTo Erreur
Dim SousRépertoire As String
Dim Val As String
SousRépertoire = Dir(Répertoire, vbDirectory + vbHidden + vbSystem + vbArchive)
Do While SousRépertoire <> ""
If SousRépertoire <> "." And SousRépertoire <> ".." Then
If (GetAttr(Répertoire & SousRépertoire) And vbDirectory) = vbDirectory Then
SupprimeRépertoire (Répertoire & SousRépertoire & "")
Else
Val = Répertoire & SousRépertoire
SetAttr Val, vbReadOnly = 0
Kill (Répertoire & SousRépertoire)
End If
End If
SousRépertoire = Dir(Répertoire, vbDirectory + vbHidden + vbSystem + vbArchive)
If SousRépertoire = "." Then
SousRépertoire = Dir
End If
If SousRépertoire = ".." Then
SousRépertoire = Dir
End If
Loop
SuppRep = True
Exit Function
Erreur:
SuppRep = False
End Function
Voilà ! Il y a plein d'autres solutions, mais je m'arrête là !
Bonne prog !!!
21 août 2003 à 16:37
Merki
3 avril 2003 à 12:39
31 déc. 2002 à 16:34
Bonne prog !
31 déc. 2002 à 14:04
il n'y à plus que 3 lignes de code
30 déc. 2002 à 13:47
P.S. : Active un peu les heuristiques Bloodhound de ton Norton AntiVirus 2002 au niveau de protection maximal et teste ton code avec le FSO. Normalement, il devrait réagir !!!
Bonne prog !!!
30 déc. 2002 à 13:28
après moi je donne ce source a titre d'exemple pour que l'on puisse comparer +ieur source. Je trouve qu'il est bien d'avoir le choix entre 2 (voir +) sources
SupraDolph
30 déc. 2002 à 08:42
au moin il y a de dependance au mieux ! c'est !
30 déc. 2002 à 07:55
Merci pour tes commentaires SupraDolph !
Bonne prog !!!
30 déc. 2002 à 00:55
Public Function SupprimeRepertoire(Repertoire As String)
If Right(Repertoire, 1) "BACKSLASH" Then Repertoire Left(Repertoire, Len(Repertoire) - 1)
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
fs.DeleteFile Repertoire & "BACKSLASH*.*", True
fs.DeleteFolder Repertoire, False
End Function
Bon Prog
SupraDolph
30 déc. 2002 à 00:43
Public Function SupprimeRepertoire(Repertoire As String)
If Right(Repertoire, 1) "" Then Repertoire Left(Repertoire, Len(Repertoire) - 1)
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
fs.DeleteFile Repertoire & "*.*", True
fs.DeleteFolder Repertoire, False
End Function
Bon Prog
SupraDolph
29 déc. 2002 à 23:32
Bonne prog !
29 déc. 2002 à 23:24