I have the below code that deletes all files within a SAS folder. I would like to modify it, or come up with a different solution that would only delete the files in the said folder if older than 5 days. Any help would be appreciated!
%macro delete_all_the_files_in_folder(folder);
filename filelist "&folder";
data _null_;
dir_id = dopen('filelist');
total_members = dnum(dir_id);
do i = 1 to total_members; /* walk through all the files in the folder */
member_name = dread(dir_id,i);
file_id = mopen(dir_id,member_name,'i',0);
if file_id > 0 then do; /* if the file is readable */
freadrc = fread(file_id);
rc = fclose(file_id);
rc = filename('delete',member_name,,,'filelist');
rc = fdelete('delete');
end;
rc = fclose(file_id);
end;
rc = dclose(dir_id);
run;
%mend;
%delete_all_the_files_in_folder(/sasem/service/Face_IT/Export/)
Hi sastef41,
Your exact same problem is solved in my recent blog post SAS administrators tip: Automatically deleting old SAS logs .
There, I used the following code:
%macro mr_clean(dirpath=,dayskeep=30,ext=.log);
data _null_;
length memname $256;
deldate = today() - &dayskeep;
rc = filename('indir',"&dirpath");
did = dopen('indir');
if did then
do i=1 to dnum(did);
memname = dread(did,i);
if reverse(trim(memname)) ^=: reverse("&ext") then continue;
rc = filename('inmem',"&dirpath/"!!memname);
fid = fopen('inmem');
if fid then
do;
moddate = input(finfo(fid,'Last Modified'),date9.); /* see WARNING below */
rc = fclose(fid);
if . < moddate <= deldate then rc = fdelete('inmem');
end;
end;
rc = dclose(did);
rc = filename('inmem');
rc = filename('indir');
run;
%mend mr_clean;
You can easily modify it to adapt to your scenario.
The key here is the following statement to capture file date stamp:
moddate = input(finfo(fid,'Last Modified'),date9.);
and IF statement to delete files of specified date interval:
if . < moddate <= deldate then rc = fdelete('inmem');
Hope, this help.
%macro delete_all_the_files_in_folder(folder);
filename filelist "&folder";
data _null_;
dir_id = dopen('filelist');
total_members = dnum(dir_id);
do i = 1 to total_members; /* walk through all the files in the folder */
member_name = dread(dir_id,i);
file_id = mopen(dir_id,member_name,'i',0);
if file_id > 0 then do; /* if the file is readable */
freadrc = fread(file_id);
if finfo(file_id,"info_item") < value then do;
/* info_item is operating system- and locale-dependent */
/* determine it by using foptname() once */
/* value must match the type, usually datetime */
rc = fclose(file_id);
rc = filename('delete',member_name,,,'filelist');
rc = fdelete('delete');
end;
end;
rc = fclose(file_id);
end;
rc = dclose(dir_id);
run;
%mend;
As stated in the comment, you need to run a loop from 1 to foptnum once and use foptname(file_id,num) to find the correct name for your "file information item".
But since this is highly dependent on the operating environment anyway, I'd much rather use OS tools to get this done, e.g. by using ls with proper options to retrieve the last modification timestamps for all files; Linux (GNU) ls provides options for outputting the modification timestamp in GMT in ISO 8601 notation.
Hi sastef41,
Your exact same problem is solved in my recent blog post SAS administrators tip: Automatically deleting old SAS logs .
There, I used the following code:
%macro mr_clean(dirpath=,dayskeep=30,ext=.log);
data _null_;
length memname $256;
deldate = today() - &dayskeep;
rc = filename('indir',"&dirpath");
did = dopen('indir');
if did then
do i=1 to dnum(did);
memname = dread(did,i);
if reverse(trim(memname)) ^=: reverse("&ext") then continue;
rc = filename('inmem',"&dirpath/"!!memname);
fid = fopen('inmem');
if fid then
do;
moddate = input(finfo(fid,'Last Modified'),date9.); /* see WARNING below */
rc = fclose(fid);
if . < moddate <= deldate then rc = fdelete('inmem');
end;
end;
rc = dclose(did);
rc = filename('inmem');
rc = filename('indir');
run;
%mend mr_clean;
You can easily modify it to adapt to your scenario.
The key here is the following statement to capture file date stamp:
moddate = input(finfo(fid,'Last Modified'),date9.);
and IF statement to delete files of specified date interval:
if . < moddate <= deldate then rc = fdelete('inmem');
Hope, this help.
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.