ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

utilitaire "Xdel" : permet de supprimer des fichiers (& répertoires vides) récursivement   



L'auteur

Francis Faure
France France
Membre Actif (personne physique)
# 0000000001
enregistré le 11/10/2004

http://www.wanagain.net
51 ans
Faure Francis
de la société Design Or Decline
Fiche personnelle


Note des membres
18/20
2 votes


Contributions > 01 - PRG : Programmation

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é 7358 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)

? Xdel("C:\data\vfpXdel\test\*.*","/D /N /S /H /L /Q/O")

* 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 as string, p_options as Stringas Integer
  LOCAL li_nbfichier as Integer
  LOCAL li_nbsubdir as Integer
  LOCAL li_totalnbfichier as Integer
  LOCAL lc_dir  as String
  LOCAL ARRAY la_tab[1,5]
  LOCAL ll_i as integer
  LOCAL lc_subdir as string
  LOCAL lc_hidden as string
  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
  IF TYPE("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
  IF TYPE("m.p_files")<>"C"
    =Xdel_Trace(ERROR1, m.ll_filelog)
    IF NOT 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))
  IF NOT "\"$m.p_files
    =Xdel_Trace(ERROR1, m.ll_filelog)
    IF NOT m.ll_quite
      =MESSAGEBOX(ERROR1,16, "Xdel")
    endif
    RETURN 0
  endif
  IF NOT DIRECTORY(m.lc_dir)
    =Xdel_Trace(ERROR2, m.ll_filelog)
    IF NOT 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)
      IF NOT m.ll_quite
        =MESSAGEBOX(ERROR3 + m.lc_dir + m.la_tab[m.ll_i, 1], 0+16, "Xdel")
      endif
    else
      if NOT m.ll_erase OR ;
         MESSAGEBOX(CONFIRM_DELETE_FILE + m.lc_dir + m.la_tab[m.ll_i,1], 4+48, "Xdel")==6 && YES
        IF NOT m.ll_quite
          WAIT windows "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)
          IF NOT 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
  IF NOT m.ll_quite
    WAIT clear
  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 :

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

le 24/10/2007, Francis Faure a écrit :
Merci. c'est corrigé.
le 06/11/2007, eddymaue a écrit :
Jean-Paul es-tu parent avec Hermione Granger ?
le 22/10/2009, 29731 a écrit :
Bonjour,

Merci pour cette source. Que du bonheur !

Par contre, j'ai un petit soucis d'utilisation. Il refuse d'effacer les fichiers Thumb.db...

Une Idée?


Publicité

Les pubs en cours :


www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2019.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3