Publicado el :
Utilidad NINGUNA

Macro mf_mkdir - Creación recursiva de directorios

Este código también está disponible en: Deutsch English Français
La macro `mf_mkdir` está diseñada para crear un directorio especificado por el parámetro `dir`. Gestiona de forma robusta las rutas verificando y eliminando cualquier carácter de barra oblicua (`/` o `\`) al final de la ruta, así como ignorando las rutas que representan solo letras de unidad (como 'C:').
Antes de intentar crear un directorio, la macro utiliza `%sysfunc(fileexist())` para verificar su existencia. Si el directorio no existe, descompone la ruta en su directorio hijo más profundo (`child`) y su directorio padre (`parent`). Luego se llama a sí misma recursivamente (`%mf_mkdir(&parent)`) para asegurar que se creen todos los directorios padre. Una vez establecidos los padres, utiliza `%sysfunc(dcreate(&child, &parent))` para crear el directorio final. En caso de fallo en la creación, se muestra un mensaje de error a través de `%put ERROR:` y la ejecución se cancela con `%abort cancel`. Si el directorio ya existe, la macro finaliza silenciosamente. La macro está diseñada para funcionar en entornos Windows y Unix, lo que la hace compatible con SAS© Viya 4.
Análisis de datos

Type : NINGUNA


La macro no procesa conjuntos de datos SAS. Opera directamente en el sistema de archivos utilizando una ruta de directorio proporcionada como parámetro.

1 Bloque de código
Macro %mf_mkdir
Explicación :
Este bloque contiene la definición completa de la macro `%mf_mkdir`. La macro toma una ruta de directorio (`dir`) como parámetro.

Comienza con verificaciones de entrada: detecta e ignora las rutas que son letras de unidad (ej: 'C:') y elimina las barras oblicuas finales si están presentes, excepto para el directorio raíz. Esto asegura una manipulación consistente de las rutas.

El núcleo de la lógica es un bloque condicional que se ejecuta si el directorio objetivo no existe (verificado por `%sysfunc(fileexist)`). Dentro de este bloque:
1. La ruta se descompone para identificar el último componente (`child`) y la ruta de su padre (`parent`).
2. La macro se llama a sí misma de forma recursiva (`%mf_mkdir(&parent)`) para garantizar que existan todos los directorios padre antes de intentar crear el directorio actual.
3. El directorio `child` se crea en el `parent` utilizando la función `%sysfunc(dcreate(&child, &parent))`. Esta función es compatible con los sistemas de archivos Windows y Unix.
4. Se incluye una gestión de errores rudimentaria: si `dcreate` falla (devuelve una cadena vacía), se muestra un mensaje de error (`%put ERROR:`) y la ejecución de la sesión SAS se detiene (`%abort cancel`). En caso de éxito, se muestra un mensaje de confirmación.

La macro está diseñada para ser idempotente: si el directorio ya existe, no hace nada y finaliza silenciosamente.
¡Copiado!
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;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.
Información de copyright : Copyright (c) 2001-2006 Rodney Sparapani; Copyright 2010-2023 HMS Analytical Software GmbH, http://www.analytical-software.de (información extraída del archivo _version.sas referenciado en la ayuda de la macro).