Publié le :

Macro mf_mkdir - Création récursive de répertoires

Ce code est également disponible en : Deutsch English Español
La macro `mf_mkdir` est conçue pour créer un répertoire spécifié par le paramètre `dir`. Elle gère de manière robuste les chemins en vérifiant et en supprimant les éventuels caractères de barre oblique (`/` ou `\`) en fin de chemin, ainsi qu'en ignorant les chemins qui représentent des lettres de lecteur seules (comme 'C:').
Avant de tenter de créer un répertoire, la macro utilise `%sysfunc(fileexist())` pour vérifier son existence. Si le répertoire n'existe pas, elle décompose le chemin en son répertoire enfant le plus profond (`child`) et son répertoire parent (`parent`). Elle s'appelle ensuite récursivement (`%mf_mkdir(&parent)`) pour s'assurer que tous les répertoires parents sont créés. Une fois les parents établis, elle utilise `%sysfunc(dcreate(&child, &parent))` pour créer le répertoire final. En cas d'échec de la création, un message d'erreur est affiché via `%put ERROR:` et l'exécution est annulée avec `%abort cancel`. Si le répertoire existe déjà, la macro se termine silencieusement. La macro est conçue pour fonctionner sur les environnements Windows et Unix, ce qui la rend compatible avec SAS© Viya 4.
Analyse des données

Type : AUCUNE


La macro ne traite pas de jeux de données SAS. Elle opère directement sur le système de fichiers en utilisant un chemin de répertoire fourni en paramètre.

1 Bloc de code
Macro %mf_mkdir
Explication :
Ce bloc contient l'intégralité de la définition de la macro `%mf_mkdir`. La macro prend un chemin de répertoire (`dir`) en paramètre.

Elle commence par des vérifications d'entrée : elle détecte et ignore les chemins qui sont des lettres de lecteur (ex: 'C:') et retire les barres obliques de fin si présentes, sauf pour le répertoire racine. Ceci assure une manipulation cohérente des chemins.

Le cœur de la logique est un bloc conditionnel qui s'exécute si le répertoire cible n'existe pas (vérifié par `%sysfunc(fileexist)`). À l'intérieur de ce bloc :
1. Le chemin est décomposé pour identifier le dernier composant (`child`) et le chemin de son parent (`parent`).
2. La macro s'appelle elle-même de manière récursive (`%mf_mkdir(&parent)`) pour garantir que tous les répertoires parents existent avant de tenter de créer le répertoire actuel.
3. Le répertoire `child` est créé dans le `parent` en utilisant la fonction `%sysfunc(dcreate(&child, &parent))`. Cette fonction est compatible avec les systèmes de fichiers Windows et Unix.
4. Une gestion d'erreur rudimentaire est incluse : si `dcreate` échoue (retourne une chaîne vide), un message d'erreur est affiché (`%put ERROR:`) et l'exécution de la session SAS est arrêtée (`%abort cancel`). En cas de succès, un message de confirmation est affiché.

La macro est conçue pour être idempotente : si le répertoire existe déjà, elle ne fait rien et se termine silencieusement.
Copié !
1%macro mf_mkdir(dir
2)/*/STORE SOURCE*/;
3 
4 %local lastchar child parent;
5 
6 %let lastchar = %substr(&dir, %LENGTH(&dir));
7 %IF (%bquote(&lastchar) eq %str(:)) %THEN %DO;
8 /* Cannot create drive mappings */
9 %return;
10 %END;
11 
12 %IF (%bquote(&lastchar)=%str(/)) or (%bquote(&lastchar)=%str(\\_)) %THEN %DO;
13 /* last char is a slash */
14 %IF (%LENGTH(&dir) eq 1) %THEN %DO;
15 /* one single slash - root location is assumed to exist */
16 %return;
17 %END;
18 %ELSE %DO;
19 /* strip last slash */
20 %let dir = %substr(&dir, 1, %LENGTH(&dir)-1);
21 %END;
22 %END;
23 
24 %IF (%sysfunc(fileexist(%bquote(&dir))) = 0) %THEN %DO;
25 /* directory does not exist so prepare to create */
26 /* first get the childmost directory */
27 %let child = %scan(&dir, -1, %str(/\\:));
28 
29 /*
30 If child name = path name then there are no parents to create. Else
31 they must be recursively scanned.
32 */
33 
34 %IF (%LENGTH(&dir) gt %LENGTH(&child)) %THEN %DO;
35 %let parent = %substr(&dir, 1, %LENGTH(&dir)-%LENGTH(&child));
36 %mf_mkdir(&parent)
37 %END;
38 
39 /*
40 Now create the directory. Complain loudly of any errs.
41 */
42 
43 %let dname = %sysfunc(dcreate(&child, &parent));
44 %IF (%bquote(&dname) eq ) %THEN %DO;
45 %put %str(ERR)OR: could not create &parent + &child;
46 %abort cancel;
47 %END;
48 %ELSE %DO;
49 %put Directory created: &dir;
50 %END;
51 %END;
52 /* exit quietly if directory did exist.*/
53%mend mf_mkdir;
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 (c) 2001-2006 Rodney Sparapani; Copyright 2010-2023 HMS Analytical Software GmbH, http://www.analytical-software.de (informations extraites du fichier _version.sas référencé dans l'aide de la macro).