In the past when I needed a list of files in a directory I would use the filename command with the pipe device type as follows:
filename dirlist pipe 'dir "c:\temp\"
However, under Windows 7, I am getting the following error message noted
here:
Stderr output:
There is not enough space on the disk.
NOTE: 0 records were read from the infile DIR.
Also, when code is sent to an IOM server that uses the FILENAME PIPE command, the code fails with ERROR: Access is denied or ERROR: Insufficient authorization.
As a result, I wrote the below macro that utilizes SAS component language (SCL) functions to get around these restrictions.
%macro directorylisting
(
path =
, outdsn = dirlist
, where =
, after = 01Jan1960
) ;
data &outdsn. ( keep = filename fullfilename created modified bytes ) ;
attrib
dref length = $8
fref length = $8
folder length = $256
filename length = $128 label = 'Filename'
fullfilename length = $256 label = 'Full Filename'
created length = 8 label = 'Created' format = datetime19.
modified length = 8 label = 'Modified' format = datetime19.
bytes length = 8 label = 'Bytes' format = comma15. ;
if fileexist( "&path." ) then do ;
folder = ifc( substr( "&path.", lengthn( "&path." ), 1 ) = "\"
, "&path.", cats( "&path.", "\" ) ) ;
rc = filename( dref, folder );
did = dopen( dref ) ;
dcount = dnum( did ) ;
do i = 1 to dcount ;
filename = dread( did, i ) ;
if find( filename, "&where.", 'i' ) > 0 then do ;
fullfilename = cats( folder, filename ) ;
rc = filename( fref, fullfilename ) ;
fid = fopen( fref ) ;
modified = input( finfo( fid, 'Last Modified' ), anydtdtm. ) ;
if datepart( modified ) >= "&after."d then do ;
created = input( finfo( fid, 'Create Time' ), anydtdtm. ) ;
bytes = input( finfo( fid, 'File Size (bytes)' ), 18. ) ;
output ;
end ;
fid = fclose( fid ) ;
rc = filename( fref, '' ) ;
end ;
end ;
did = dclose( did ) ;
rc = filename( dref, '' ) ;
end ;
else put "ERROR: The folder &path. does not exist." ;
run ;
%mend ;
This macro solved my problem accessing with pipes! Thanks Tom!
ReplyDelete