/* === %ListRecursive(work.table, "C:/katalog"); %ListRecursive(work.table, "C:/katalog", MAXDEPTH=1); === */ %macro ListRecursive(DATASET, DIRNAME, MAXDEPTH=-1); %let DIRNAME = &DIRNAME; %let DATASET = &DATASET; %macro DataDirWalk(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; %let FILESCNT = %sysfunc(dnum(&DIRID)); %if &FILESCNT > 0 %then %do; %do I = 1 %to &FILESCNT; %let NAME = %sysfunc(dread(&DIRID, &I)); %let PATH = %sysfunc(trim(&DIRNAME/&NAME)); fileNum = &I; fileName = "&NAME"; filePath = "&PATH"; parentDir = "&DIRNAME"; depth = &DEPTH; output; %if &LEVEL ne 0 %then %do; %let DEPTH = %eval(&DEPTH + 1); %DataDirWalk("&PATH", MAXDEPTH=%sysfunc(max(&LEVEL-1, -1))); %let DEPTH = %eval(&DEPTH - 1); %end; %end; %end; %let RC = %sysfunc(dclose(&DIRID)); %end; %mend DataDirWalk; data &DATASET; format fileName $32.; format filePath $128.; format parentDir $96.; format depth best4.; format fileNum best8.; %DataDirWalk(&DIRNAME, MAXDEPTH=&MAXDEPTH); run; %mend;