/** @file @brief Returns all folders / subfolder content for a particular root @details Shows all members and SubTrees recursively for a particular root. Note - for big sites, this returns a lot of data! So you may wish to reduce the logging to speed up the process (see example below), OR - use mm_tree.sas which uses proc metadata and is far more efficient. Usage: options ps=max nonotes nosource; %mm_getfoldertree(root=/My/Meta/Path, outds=iwantthisdataset) options notes source; @param [in] root= the parent folder under which to return all contents @param [out] outds= the dataset to create that contains the list of directories @param [in] mDebug= set to 1 to show debug messages in the log

SAS Macros

@version 9.4 @author Allan Bowe **/ %macro mm_getfoldertree( root= ,outds=work.mm_getfoldertree ,mDebug=0 ,depth=50 /* how many nested folders to query */ ,level=1 /* system var - to track current level depth */ ,append=NO /* system var - when YES means appending within nested loop */ )/*/STORE SOURCE*/; %if &level>&depth %then %return; %local mD; %if &mDebug=1 %then %let mD=; %else %let mD=%str(*); %&mD.put Executing &sysmacroname; %&mD.put _local_; %if &append=NO %then %do; /* ensure table doesn't exist already */ data &outds; run; proc sql; drop table &outds; %end; /* get folder contents */ data &outds.TMP/view=&outds.TMP; length metauri pathuri $64 name $256 path $1024 assoctype publictype MetadataUpdated MetadataCreated $32; keep metauri assoctype name publictype MetadataUpdated MetadataCreated path; call missing(of _all_); path="&root"; rc=metadata_pathobj("",path,"Folder",publictype,pathuri); if publictype ne 'Tree' then do; putlog "%str(WAR)NING: Tree " path 'does not exist!' publictype=; stop; end; __n1=1; do while(metadata_getnasl(pathuri,__n1,assoctype)>0); __n1+1; /* Walk through all possible associations of this object. */ __n2=1; if assoctype in ('Members','SubTrees') then do while(metadata_getnasn(pathuri,assoctype,__n2,metauri)>0); __n2+1; call missing(name,publictype,MetadataUpdated,MetadataCreated); __rc1=metadata_getattr(metauri,"Name", name); __rc2=metadata_getattr(metauri,"MetadataUpdated", MetadataUpdated); __rc3=metadata_getattr(metauri,"MetadataCreated", MetadataCreated); __rc4=metadata_getattr(metauri,"PublicType", PublicType); output; end; n1+1; end; drop __:; run; proc append base=&outds data=&outds.TMP; run; data _null_; set &outds.TMP(where=(assoctype='SubTrees')); call execute('%mm_getfoldertree(root=' !!cats(path,"/",name)!!",outds=&outds,mDebug=&mdebug,depth=&depth" !!",level=%eval(&level+1),append=YES)"); run; %mend;