2013年11月4日月曜日

SASからCopyFileAを呼び出して、ファイルをコピー

SASからWindowsのAPIをコールするサンプルコードです。バージョンアップによるデータの引越しで、今回はWinAPIを使ったツールを作る予定です。動作確認したのは、Windows7+SAS9.2です。

ネットにはいくつか見本が転がっていますが、PDFで文字が化けていたり、APIがまったく変わってしまったようなものもあります。素直に動くものが少ないので、いくつかの手本を元に作成しました。APIの定義をテキストで別に用意している例が多いのですが、カタログを使った例がまとまりが良いです。

/*
*++
* WinAPI(CopyFileA)を呼び出して、ファイルをコピー
*--
*/

filename winapi catalog 'WORK.Windows.WINAPI.SOURCE';

data _null_;
 file winapi;
 input;
 put _infile_;
 cards4;
routine CopyFileA
 module=KERNEL32
 minarg=3 maxarg=3 stackpop=called
 returns=ushort
;
arg 1 input char format=$cstr200.; * FROM ;
arg 2 input char format=$cstr200.; * TO ;
arg 3 input num format=pib4. byvalue;
* 1=Do Not Overwrite Existing ;
* 0=Overwrite Existing File ;
;;;;
run;

filename winapi;
filename sascbtbl catalog 'WORK.Windows.WINAPI.SOURCE';

data _null_;
 rc = modulen('*e', 'CopyFileA', 'c:\temp\foo.txt', 'c:\temp\foo_copy.txt', 0);
 put _all_;
run;

filename sascbtbl clear;


0 件のコメント :

コメントを投稿