/* === %DirWalk("C:/katalog/", MAXDEPTH=0); %DirWalk("C:/katalog/", MAXDEPTH=1); %DirWalk("C:/katalog/", MAXDEPTH=-1); %DirWalk("C:/katalog/"); === */ %macro DirWalk(DIRNAME, MAXDEPTH=-1); %local I FILEREF RC DIRID FILESCNT LEVEL LEN; %let DIRNAME = %sysfunc(translate(&DIRNAME, "/", "\")); %let DIRNAME = %sysfunc(compress(&DIRNAME, '"')); %let LEN = %sysfunc(length(&DIRNAME)); %let LAST = %sysfunc(substr(&DIRNAME, &LEN, 1)); %if "&LAST" = "/" %then %let DIRNAME = %sysfunc(substr(&DIRNAME, 1, &LEN - 1)); %let LEVEL = %eval(&MAXDEPTH); %if %sysfunc(symexist(DEPTH)) = 0 %then %let DEPTH = 1; %let RC = %sysfunc(filename(FILEREF, "&DIRNAME")); %let DIRID = %sysfunc(dopen(&FILEREF)); %if &DIRID > 0 %then %do; * seems to be a directory, so walk it; %let FILESCNT = %sysfunc(dnum(&DIRID)); %if &FILESCNT > 0 %then %do; %do I = 1 %to &FILESCNT; %let NAME = %sysfunc(trim(&DIRNAME/%sysfunc(dread(&DIRID, &I)))); %put &DEPTH &LEVEL &I &NAME; %if &LEVEL ne 0 %then %do; %let DEPTH = %eval(&DEPTH + 1); %dirWalk("&NAME", MAXDEPTH=%sysfunc(max(&LEVEL - 1, -1))); %let DEPTH = %eval(&DEPTH - 1); %end; %end; %end; %let RC = %sysfunc(dclose(&DIRID)); %end; %mend DirWalk;