Attention : Ce code nécessite des droits administrateur.
Cette macro, `mp_deletefolder`, est conçue pour effacer un répertoire spécifié ainsi que tout son contenu (fichiers et sous-répertoires). Elle commence par vérifier la validité du chemin du dossier. Si le dossier est valide, elle utilise une autre macro (`%mp_dirlist`) pour obtenir une liste récursive de tous les éléments à l'intérieur du dossier. Cette liste est ensuite triée par niveau décroissant pour s'assurer que les éléments internes sont supprimés avant leurs conteneurs. Le dossier racine est explicitement ajouté à la liste de suppression. Un `DATA _NULL_` est utilisé pour itérer sur cette liste, supprimant chaque fichier et dossier à l'aide des fonctions `filename()` et `fdelete()`, avec une gestion d'erreur rudimentaire. Enfin, la table temporaire utilisée pour la liste des dossiers est supprimée.
Analyse des données
Type : CREATION_INTERNE
Le script génère une table temporaire (`work.&tempds`) pour stocker la liste des chemins de fichiers et de dossiers à supprimer. Ces chemins sont obtenus par introspection du système de fichiers via la macro `mp_dirlist`, et non pas par des données métiers externes ou de la bibliothèque SASHELP. L'entrée principale est un chemin de système de fichiers.
1 Bloc de code
Macro SAS
Explication : Ce bloc initialise la macro `mp_deletefolder`. Il vérifie d'abord si le chemin fourni (`&folder`) est un répertoire valide et accessible à l'aide de la macro `%mf_isdir`. Si c'est le cas, il déclare une variable locale `tempds` et lui assigne un nom unique généré par `%mf_getuniquename()` pour une table de travail temporaire qui stockera la liste des éléments à supprimer.
Explication : La macro `%mp_dirlist` est appelée pour générer une liste récursive de tous les fichiers et sous-dossiers contenus dans le répertoire spécifié par `&folder`. Les résultats de cette liste sont stockés dans la table temporaire `work.&tempds`, avec une profondeur maximale de recherche (`maxdepth=MAX`).
Explication : Cette étape `PROC SORT` trie la table temporaire `work.&tempds` par la variable `level` en ordre décroissant. Ceci est crucial pour assurer que les fichiers et sous-dossiers les plus profonds (niveau plus élevé) sont supprimés avant leurs dossiers parents, évitant ainsi des erreurs de suppression de dossiers non vides.
Copié !
/* sort descending level so can delete folder contents before folders */
proc sort data=work.&tempds;
by descending level;
run;
1
/* sort descending level so can delete folder contents before folders */
2
PROC SORTDATA=work.&tempds;
3
BY descending level;
4
RUN;
4 Bloc de code
PROC SQL
Explication : Ce bloc `PROC SQL` ajoute explicitement le chemin du dossier racine (`&folder`) à la table `work.&tempds`. Cela garantit que le dossier initial, une fois vidé de son contenu, sera également supprimé à la fin du processus.
Copié !
/* ensure top level folder is removed at the end */
proc sql;
insert into work.&tempds set filepath="&folder";
1
/* ensure top level folder is removed at the end */
2
3
PROC SQL;
4
insert into work.&tempds SET filepath="&folder";
5
5 Bloc de code
DATA STEP
Explication : Ce `DATA _NULL_` est le cœur de la logique de suppression. Il itère sur chaque enregistrement de la table `work.&tempds`. Pour chaque `filepath`, il assigne une référence de fichier temporaire (`fref`) à l'aide de la fonction `filename()`, puis tente de supprimer le fichier ou le dossier avec `fdelete()`. En cas d'erreur (`rc` différent de zéro), un message est affiché dans le journal SAS. La référence de fichier est ensuite libérée.
Copié !
/* delete everything */
data _null_;
set work.&tempds end=last;
length fref $8;
fref='';
rc=filename(fref,filepath);
rc=fdelete(fref);
if rc then do;
msg=sysmsg();
put "&sysmacroname:" / rc= / msg= / filepath=;
end;
rc=filename(fref);
run;
1
/* delete everything */
2
DATA _null_;
3
SET work.&tempds END=last;
4
LENGTH fref $8;
5
fref='';
6
rc=filename(fref,filepath);
7
rc=fdelete(fref);
8
IF rc THENDO;
9
msg=sysmsg();
10
put "&sysmacroname:" / rc= / msg= / filepath=;
11
END;
12
rc=filename(fref);
13
RUN;
6 Bloc de code
PROC SQL
Explication : Après la suppression de tous les éléments, ce bloc `PROC SQL` supprime la table temporaire `work.&tempds`, libérant ainsi les ressources et nettoyant l'environnement de travail.
Copié !
/* tidy up */
proc sql;
drop table work.&tempds;
1
/* tidy up */
2
3
PROC SQL;
4
drop TABLE work.&tempds;
5
7 Bloc de code
Macro SAS
Explication : Ce bloc contient la fin de la logique conditionnelle. Si le dossier initial n'était pas valide ou accessible (condition du `%if` initial), un message d'erreur est affiché dans le journal SAS, indiquant que le dossier spécifié n'est pas valide. Enfin, `%mend mp_deletefolder;` marque la fin de la définition de la macro.
Copié !
%end;
%else %put &sysmacroname: &folder: is not a valid / accessible folder. ;
%mend mp_deletefolder;
1
%END;
2
%ELSE %put &sysmacroname: &folder: is not a valid / accessible folder. ;
3
%mend mp_deletefolder;
4
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : Copyright 2010-2023 HMS Analytical Software GmbH, http://www.analytical-software.de
« La macro mp_deletefolder illustre une règle d'or de la gestion de fichiers : on ne peut supprimer un répertoire que s'il est rigoureusement vide. L'intelligence de ce script réside dans l'utilisation d'un tri par niveau décroissant (descending level). Cette approche "Bottom-Up" garantit que les fichiers et sous-dossiers les plus profonds sont effacés avant que SAS ne tente de supprimer les dossiers parents, évitant ainsi les échecs de suppression systématiques rencontrés avec une approche classique. »
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.