utilitaire "Xdel" : permet de supprimer des fichiers (& répertoires vides) récursivement
# 0000000449
ajouté le 03/06/2007 20:42:49 et modifié le 24/10/2007
consulté 11486 fois
Niveau
débutant
Version(s) Foxpro : VFP 9.0
Description
exemple d'utilisation :
SET PROCEDURE TO vfpXdel
* suppression du répertoire "C:\data\vfpXdel\test\" (et de ses sous répertoires)
* suppression des fichiers .bak du répertoire temp
? Xdel("C:\temp\*.bak","/N /L /O /Q /S")
Code source :
*-------------------------------------------------------------------------------------------------------------- * XDEL V1.0 * Francis FAURE * Visual FoxPro 9 * www.vfp.fr/xdel.asp *-------------------------------------------------------------------------------------------------------------- * Xdel permet de supprimer des fichiers (& répertoires vides) récursivement *-------------------------------------------------------------------------------------------------------------- * Paramétres : * p_files : Unité:\répertoire\masque" * exemple * =Xdel("c:\temp\t*.tmp") * pas de défaut * pour éviter les boulettes on impose préciser une unité, un chemin et un masque * on vérifie que le chemin existe * [_options] : * /D supprime les sous-répertoires vides * /N efface les fichier spécifiés sans confirmation (attention !) * /S traiter les fichiers des sous-répertoires (récursif) * /H traiter aussi les fichiers cachés (hidden) * /L faire un log * /Q quiete : faire l'opération sans afficher de messages d'information (sauf la question de suppression de /N) * /O option "no recycle" : ne pas mettre a la poubelle (défaut) * exemple * =Xdel("c:\temp\*.bak","/D /N /O /S /L") * cet exemple supprime les fichiers *.bak du répertoire c:\temp et de tous ses sous répertoires, sans confirmer, sans mettre à la corbeille,et traite aussi tout les sous répertoires de c:\temp, et fait un log *-------------------------------------------------------------------------------------------------------------- * Retourne le nombre de fichiers supprimés *-------------------------------------------------------------------------------------------------------------- * chaine utilisée pour localisation
#define ERROR1 "La fonction 'XDEL' doit être appellée avec au moins un paramétre (Unité:\répertoire\masque)."
#define ERROR2 "ce répertoire n'existe pas."
#define ERROR3 "Ce fichier est en lecture seule : "
#define CONFIRM_DELETE_FILE "Confirmez-vous la suppression du fichier : "
#define FILELOG "xdel.log" *-------------------------------------------------------------------------------------------------------------- FUNCTION Xdel(p_files asstring, p_options asString) asInteger LOCAL li_nbfichier asInteger LOCAL li_nbsubdir asInteger LOCAL li_totalnbfichier asInteger LOCAL lc_dir asString LOCALARRAYla_tab[1,5] LOCAL ll_i asinteger LOCAL lc_subdir asstring LOCAL lc_hidden asstring LOCAL ll_subDir as Boolean LOCAL ll_filelog as Boolean LOCAL ll_rmdir as Boolean LOCAL ll_erase as Boolean LOCAL ll_quite as Boolean LOCAL lc_recycle as Boolean
li_totalnbfichier = 0 * traiter les options IFTYPE("m.p_options")<>"C"
p_options = "" ENDIF
p_options = UPPER(ALLTRIM(m.p_options)) * avec fichier cachés
lc_hidden = IIF("/H"$m.p_options, "H","") * traiter les sous répertoire
ll_subDir = "/S"$m.p_options * faire un log
ll_filelog = "/L"$m.p_options * supprimer le répertoire si vide
ll_rmdir = "/D"$m.p_options * confirme la suppression
ll_erase = not"/N"$m.p_options * mode silence
ll_quite = "/Q"$m.p_options * no Recyle
lc_recycle = IIF("/O"$m.p_options, ""," RECYCLE") * vérifier que le paramétre existe IFTYPE("m.p_files")<>"C"
=Xdel_Trace(ERROR1, m.ll_filelog) IFNOT m.ll_quite
=MESSAGEBOX(ERROR1, 16, "Xdel") endif RETURN 0 endif
p_files = ALLTRIM(m.p_files) * vérifier que le répertoire existe
lc_dir = LEFT(m.p_files, RAT("\", m.p_files)) IFNOT"\"$m.p_files
=Xdel_Trace(ERROR1, m.ll_filelog) IFNOT m.ll_quite
=MESSAGEBOX(ERROR1,16, "Xdel") endif RETURN 0 endif IFNOTDIRECTORY(m.lc_dir)
=Xdel_Trace(ERROR2, m.ll_filelog) IFNOT m.ll_quite
=MESSAGEBOX(m.lc_dir + " : "+ ERROR2, 16, "Xdel") endif RETURN 0 endif * traiter les fichiers du répertoire
=Xdel_Trace(m.p_files + " " + m.p_options, m.ll_filelog)
li_nbfichier = ADIR(m.la_tab, m.p_files, m.lc_hidden, 1) FOR ll_i = 1 TO m.li_nbfichier IF"R"$m.la_tab[m.ll_i, 5]&& c'est un fichier en lecture seul
=Xdel_Trace(ERROR3 + m.lc_dir + m.la_tab[m.ll_i, 1], m.ll_filelog) IFNOT m.ll_quite
=MESSAGEBOX(ERROR3 + m.lc_dir + m.la_tab[m.ll_i, 1], 0+16, "Xdel") endif else ifNOT m.ll_erase OR ; MESSAGEBOX(CONFIRM_DELETE_FILE + m.lc_dir + m.la_tab[m.ll_i,1], 4+48, "Xdel")==6 && YES IFNOT m.ll_quite WAITwindows"Erase " + m.lc_dir + m.la_tab[m.ll_i, 1]nowait ENDIF * suppression TRY erase (m.lc_dir + m.la_tab[m.ll_i, 1] + m.lc_recycle) && correction JPG
=Xdel_Trace("Erase " + m.lc_dir + m.la_tab[m.ll_i, 1] + m.lc_recycle, m.ll_filelog)
li_totalnbfichier = m.li_totalnbfichier + 1 CATCH * File in use
=Xdel_Trace(MESSAGE()+" : "+ m.lc_dir + m.la_tab[m.ll_i, 1] + m.lc_recycle, m.ll_filelog) IFNOT m.ll_quite
=MESSAGEBOX(MESSAGE()+" : "+ m.lc_dir + m.la_tab[m.ll_i, 1] + m.lc_recycle,16,"Xdel") endif ENDTRY ENDIF endif NEXT * traiter les sous répertoires IF m.ll_subDir
li_nbsubdir = ADIR(m.la_tab, m.lc_dir+"*", "D" + m.lc_hidden, 1) FOR ll_i = 1 TO m.li_nbsubdir IF"D"$m.la_tab[m.ll_i, 5]AND (NOT m.la_tab[m.ll_i, 1]$"..")
lc_subdir = addbs(m.lc_dir + m.la_tab[m.ll_i, 1])+substr(m.p_files, LEN(m.lc_dir)+1)
li_totalnbfichier = m.li_totalnbfichier + xdel(m.lc_subdir, m.p_options) endif NEXT ENDIF * repasse pour supprimer le répertoire si il est vide IF m.ll_rmdir
li_nbsubdir = ADIR(m.la_tab, m.lc_dir+"*", "DH", 1) FOR ll_i = 1 TO m.li_nbsubdir IF m.la_tab[m.ll_i, 1]$".."
li_nbsubdir = m.li_nbsubdir - 1 ENDIF next IF m.li_nbsubdir ==0
=Xdel_Trace("RMDIR " + m.lc_dir, m.ll_filelog) RMDIR (m.lc_dir) ELSE
=Xdel_Trace(m.lc_dir+" -> non vide", m.ll_filelog) endif endif IFNOT m.ll_quite WAITclear endif RETURN m.li_totalnbfichier * procedure pour générer un log PROCEDURE Xdel_Trace(p_chaine, p_log) IF m.p_log
=STRTOFILE(DTOC(DATE())+" "+TIME()+" - XDEL : "+m.p_chaine+CHR(13)+CHR(10), FILELOG, 1) ENDIF *? p_chaine return *--------------------------------------------------------------------------------------------------------------
Commentaires
le 24/10/2007, JpG a écrit : Bonjour Francis, Merci pour ce source qui encore une fois m'a fait gagner un temps précieux. Toutefois, tu as une petite ligne à modifier, dans le cadre de l'option /O qui n'est pas prise en compte dans tous les cas. Il te faut changer la ligne :
Bonjour Francis,
Merci pour ce source qui encore une fois m'a fait gagner un temps précieux.
Toutefois, tu as une petite ligne à modifier, dans le cadre de l'option /O qui n'est pas prise en compte dans tous les cas.
Il te faut changer la ligne :
TRY
erase (m.lc_dir + m.la_tab[m.ll_i, 1]) recycle
EN :
TRY
erase (m.lc_dir + m.la_tab[m.ll_i, 1]+ m.lc_recycle)
... sinon celà va dans la poubelle dans tous les cas.
Cordialement,
Jean-Paul GRANGER