When I work on SAS projects that create lots of files as results, it's often a requirement that those files be organized in a certain folder structure. The exact structure depends on the project, but here's an example:
/results |__ html |__ images |__ xls |__ data
Before you can have SAS populate these file folders, the folders have to actually exist. Traditionally, SAS programmers have handled this by doing one of the following:
- Simply require that the folders exist before you run through the project. (This is the SEP method: Somebody Else's Problem.)
- Use SAS statements and shell commands (via SYSTASK or other method) to create the folders as needed. The SAS-related archives are full of examples of this. It can get complex when you have to account for operating system differences, and whether operating system commands are even permitted (NOXCMD system option).
In SAS 9.3 there is a new system option that simplifies this: DLCREATEDIR. When this option is in effect, a LIBNAME statement that points to a non-existent folder will take matters into its own hands and create that folder.
Here's a simple example, along with the log messages:
options dlcreatedir; libname newdir "/u/sascrh/brand_new_folder";
NOTE: Library NEWDIR was created. NOTE: Libref NEWDIR was successfully assigned as follows: Engine: V9 Physical Name: /u/sascrh/brand_new_folder
You might be thinking, "Hey, SAS libraries are for data, not for other junk like ODS results." Listen: we've just tricked the LIBNAME statement into making a folder for you -- you can use it for whatever you want. I won't tell.
In order to create a series of nested folders, you'll have to create each folder level in top-down order. For example, if you need a "results" and a "results/images" folder, you can do this:
%let outdir=%sysfunc(getoption(work)); /* create a results folder in the WORK area, with images subfolder */ options dlcreatedir; libname res "&outdir./results"; libname img "&outdir./results/images"; /* clear the librefs - don't need them */ libname res clear; libname img clear;
Or (and this is a neat trick) you can use a single concatenated LIBNAME statement to do the job:
libname res ("&outdir./results", "&outdir./results/images"); libname res clear;
NOTE: Libref RES was successfully assigned as follows: Levels: 2 Engine(1): V9 Physical Name(1): /saswork/SAS_workC1960000554D_gsf0/results Engine(2): V9 Physical Name(2): /saswork/SAS_workC1960000554D_gsf0/results/images
If you feel that folder creation is best left to the card-carrying professionals, don't worry! It is possible for a SAS admin to restrict use of the DLCREATEDIR option. That means that an admin can set the option (perhaps to NODLCREATEDIR to prohibit willy-nilly folder-making) and prevent end users from changing it. Just let them try, and they'll see:
13 options dlcreatedir; ___________ 36 WARNING 36-12: SAS option DLCREATEDIR is restricted by your Site Administrator and cannot be updated.
That's right -- DENIED! Mordac the Preventer would be proud. Job security: achieved!
Exact documentation for how to establish Restricted Options can be a challenge to find. You'll find it within the Configuration Guides for each platform in the Install Center. Here are quick links for SAS 9.3: Windows x64, Windows x86, and UNIX.