Hi, for copying files I generally use the byte-for-byte technique including setting the chunksize to speed up the copying process %*-------------------------------------------------------------------------;
%* Set source and target (copy) path and file name values: ;
%*-------------------------------------------------------------------------;
%let infile = %str();
%let outfile = %str();
%*-------------------------------------------------------------------------;
%* Set copy mode and chunksize variables: ;
%*-------------------------------------------------------------------------;
%let mode = S ; /* I (chunksize is 1) / S (use chunksize value) */
%let chunksize = 32767 ; /* 1 - 32767 */
%*-------------------------------------------------------------------------;
%* Copy INFILE to OUTFILE using the byte-for-byte method: ;
%*-------------------------------------------------------------------------;
filename in "&infile.";
filename out "&outfile.";
data _null_;
length
ifile 8
ofile 8
fmtlen 8
bytes 8
outfmt $ 32
rec $ &chunksize.
;
ifile = fopen('in',"&mode.",&chunksize.,'B');
ofile = fopen('out','O',&chunksize.,'B');
bytes = 0;
rec = '20'x;
do while(fread(ifile) eq 0);
call missing(outfmt, rec);
rc = fget(ifile,rec,&chunksize.);
if "%upcase(&mode.)" eq "I" then do;
fmtlen = 1;
outfmt = 1;
end;
else do;
fcolin = fcol(ifile);
if (fcolin - &chunksize.) eq 1 then do;
fmtlen = &chunksize.;
end;
else do;
fmtlen = fcolin - 1;
end;
outfmt = cats("$char", fmtlen, ".");
end;
bytes + fmtlen;
rc = fput(ofile,putc(rec,outfmt));
rc = fwrite(ofile);
end;
call symputx('size', bytes);
rc = fclose(ifile);
rc = fclose(ofile);
run;
filename in clear;
filename out clear; %put File %scan(&infile.,-1,/\) copied to %scan(&outfile.,-1,/\).;
%put Transferred &size. Bytes.; Best regards, Paul
... View more