From 3b395b3ae57e0ecd5bb89cecbe68f1a51f8d51f0 Mon Sep 17 00:00:00 2001 From: Allan Bowe Date: Fri, 26 Nov 2021 16:20:33 +0000 Subject: [PATCH] chore: all.sas update --- all.sas | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 76 insertions(+), 5 deletions(-) diff --git a/all.sas b/all.sas index b35baee..1e8ec11 100644 --- a/all.sas +++ b/all.sas @@ -3066,6 +3066,74 @@ data &outds; run; %mend mp_deleteconstraints;/** + @file + @brief A macro to delete a directory + @details Will delete all folder content (including subfolder content) and + finally, the folder itself. + + Usage: + + %let rootdir=%sysfunc(pathname(work))/demo; + %mf_mkdir(&rootdir) + %mf_mkdir(&rootdir/subdir) + %mf_mkdir(&rootdir/subdir/subsubdir) + data "&rootdir/subdir/example.sas7bdat"; + run; + + %mp_deletefolder(&rootdir) + + @param path Unquoted path to the folder to delete. + +

SAS Macros

+ @li mf_getuniquename.sas + @li mf_isdir.sas + @li mp_dirlist.sas + +

Related Macros

+ @li mp_deletefolder.test.sas + +**/ + +%macro mp_deletefolder(folder); + /* proceed if valid directory */ + %if %mf_isdir(&folder)=1 %then %do; + + /* prep temp table */ + %local tempds; + %let tempds=%mf_getuniquename(); + + /* recursive directory listing */ + %mp_dirlist(path=&folder,outds=work.&tempds, maxdepth=MAX) + + /* sort descending level so can delete folder contents before folders */ + proc sort data=work.&tempds; + by descending level; + run; + + /* ensure top level folder is removed at the end */ + proc sql; + insert into work.&tempds set filepath="&folder"; + + /* delete everything */ + data _null_; + set work.&tempds end=last; + length fref $8; + rc=filename(fref,filepath); + rc=fdelete(fref); + if rc then do; + msg=sysmsg(); + put "&sysmacroname:" / rc= / msg= / filepath=; + end; + rc=filename(fref); + run; + + /* tidy up */ + proc sql; + drop table work.&tempds; + + %end; + %else %put &sysmacroname: &folder: is not a valid / accessible folder. ; +%mend mp_deletefolder;/** @file @brief Returns all files and subdirectories within a specified parent @details When used with getattrs=NO, is not OS specific (uses dopen / dread). @@ -3118,6 +3186,9 @@ run;

SAS Macros

@li mp_dropmembers.sas +

Related Macros

+ @li mp_dirlist.test.sas + @version 9.2 @author Allan Bowe **/ @@ -3138,7 +3209,7 @@ data;run; /* drop main (top) table if it exists */ %if &level=0 %then %do; - %mp_dropmembers(&outds, libref=WORK) + %mp_dropmembers(%scan(&outds,-1,.), libref=WORK) %end; data &out_ds(compress=no @@ -3253,12 +3324,12 @@ run; run; %end; -/* update main table */ -proc append base=&outds data=&out_ds; +data &out_ds; + set &out_ds(where=(filepath ne '')); run; -data &outds; - set &outds(where=(filepath ne '')); +/* update main table */ +proc append base=&outds data=&out_ds; run; /* recursive call */