Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour,
je cherche à Supprimer Simplement un répertoire et tout son contenu c'est à dire SANS devoir effacer les fichiers et dossiers et sous dossiers etc... un par un
j'ai déjà essayé avec ça :
FUNCTION ulong RemoveDirectory(ref string lpPathName) LIBRARY "kernel32.dll" ALIAS FOR "RemoveDirectoryA"
ça ne fonctionne pas (je suis sous WP Pro SP2)
j'ai aussi regardé du coté de la commande DOS RMDIR mais pour exécuter cette commande je dois la mettre dans un fichier .bat et ça ne m'arrange pas à moins qu'on me dise comment créer un fichier .bat dynamiquement depuis PB ? (parceque je ne veux pas distribuer un .bat déjà fait avec mon exe et en plus le rep à effacer change tout le temps)
merci d'avance
Hors ligne
Pour avoir passé quelques jours sur ce genre de fonction, si tu passes par une fonction PB tu dois obligatoirement supprimer les fichiers et sous dossiers contenus dans le répertoire un par un.... tu peux te faire une fonction recursive ca marche .. je dois avoir un code qui traine si ca tinteresse..
Hors ligne
ha ben oui ça m'intérèsse bien, ça me fait trop râler de devoir programmer ça
Hors ligne
/****************************************************************************************/ /* Supprime un dossier et son contenu avec le choix de supprimer les fichiers ou non */ /* */ /* Paramètres : */ /* a_repertoire : répertoire à supprimer */ /* a_suppression : détermine si on supprime les fichiers contenus dans le répertoire */ /****************************************************************************************/ string ls_search,ls_directory,ls_file,ls_new_directory,ls_test integer i,li_retour ulong lu_retour_find,lu_retour_close long ll_retour_next boolean lb_retour_supp,lb_retour,lb_fichier_supprime str_win32_find_data lstr_liste_file[] lb_fichier_supprime = true // Liste des fichiers contenus dans le dossier actuel i = 1 ls_search = a_repertoire+gs_separateur+'*' lu_retour_find=FindFirstFileA(ls_search,lstr_liste_file[i]) if lu_retour_find > 0 then do if lstr_liste_file[i].cfilename <> '.' and lstr_liste_file[i].cfilename <> '..' then // Si c'est un dossier on rappelle la fonction de suppression dossier if lstr_liste_file[i].dwFileAttributes = 16 then // On vide le dossier et on essaye de le supprimer ls_directory = a_repertoire + gs_separateur + lstr_liste_file[i].cfilename fyb_suppression_repertoire( ls_directory, a_suppression) else ls_file = a_repertoire+gs_separateur+lstr_liste_file[i].cfilename lb_fichier_supprime = false // Si c'est un fichier if a_suppression <>0 then // Suppression du fichier actuel si 1 lb_retour_supp = FileDelete(ls_file) if not lb_retour_supp then // Erreur suppression fichier FindClose(lu_retour_find) return 1 end if lb_fichier_supprime = true end if end if end if i++ ll_retour_next = FindNextFileA(lu_retour_find,lstr_liste_file[i]) loop while ll_retour_next > 0 lu_retour_close = FindClose(lu_retour_find) // Si rien dans le répertoire ou suppression fichier effectuée if lb_fichier_supprime then ls_new_directory = "c:\" // Changement de repertoire pour pouvoir supprimer le dossier courant lb_retour = SetCurrentDirectoryA(ls_new_directory) // Suppression du répertoire lb_retour=RemoveDirectoryA(a_repertoire) if not(lb_retour) then // Erreur de suppression dossier FindClose(lu_retour_find) return 2 end if else // Si lb_fichier_supprime = false : choix de pas supprimer les fichiers // On ne peut alors pas supprimer les répertoires car il reste des fichiers FindClose(lu_retour_find) return 3 end if end if FindClose(lu_retour_find) return 0
Il se peut qu'il y ait des trucs à corriger voila voila
Hors ligne
juste si tu avais la définition de str_win32_find_data ?
Dernière modification par rincevent (09-03-2007 11:37:01)
Hors ligne
en dos : rd dossier /S /Q
c'est vrai que c'est pas le top d'utiliser le dos (non-maîtrise du process, pas de récupération d'erreurs), mais là t'as pas besoin de batch, tu fais directement un Run( 'rd dossier /S /Q' )
et ensuite un DirectoryExists( dossier )
pour voir si c'est ok.
Hors ligne
global type str_win32_find_data from structure unsignedlong dwfileattributes strvb_filetime ftcreationtime strvb_filetime ftlastaccesstime strvb_filetime ftlastwritetime unsignedlong nfilesizehigh unsignedlong nfilesizelow unsignedlong dwreserved0 unsignedlong dwreserved1 character cfilename[260] character calternatefilename[14] end type
la voila ;)
Hors ligne
eRaSorZ a écrit:
en dos :
rd dossier /S /Q
c'est vrai que c'est pas le top d'utiliser le dos (non-maîtrise du process, pas de récupération d'erreurs), mais là t'as pas besoin de batch, tu fais directement unRun( 'rd dossier /S /Q' )
et ensuite unDirectoryExists( dossier )
pour voir si c'est ok.
j'ai essayé mais ça ne marche pas je ne comprends pas pq.
si dans une fenetre DOS je tape
RMDIR /S /Q c:\deleteMe
ça efface bien le dossier mais si depuis PB je fais
run('RMDIR /S /Q c:\deleteMe')
ça ne marche pas.
merci quand même pour ta participation ;)
Hors ligne
TheZerg je crois que je vais devoir reprogrammer moi même parceqe maintenant il me faut la définition de strvb_filetime et je sens qu'après ce sera une autre puis encore une autre etc.
merci quand même à tous les 2
Hors ligne
MIRACLE !
run('CMD /C "' + 'RD /S /Q c:\deleteme\' + '"')
et c'est OK
Hors ligne
rincevent a écrit:
MIRACLE !
run('CMD /C "' + 'RD /S /Q c:\deleteme\' + '"')
et c'est OK
Hors ligne