2010/09/24

実行時にファイルの指定を受け付ける様々な方法

ファイルに対して何らかの処理を行うスクリプトでは、実行時に処理対象ファイルを指定できるようにしておくと便利です。
今回は、ファイルの指定を受け付ける方法をいくつかまとめて紹介します。

ダイアログ

「Dialog」ユニットに用意されているFileDialogを使用すれば、標準的なファイル選択ダイアログを表示してファイルを選択させられます。
素早い操作には向きませんが、ソフトの操作に慣れていないユーザーに使わせる場合などには、この方法が一番分かりやすいでしょう。

下記は、ダイアログを表示して選択させたファイルの合計サイズを「alert()」関数でダイアログ表示するという例です。
FileDialogでは、複数選択の可否や初期表示ディレクトリなど様々な挙動をオプションで指定できます。詳細な説明は、同梱の「doc\Dialog.txt」を参照してください。
show()の返り値は、multiSelectがfalseの場合は一つのFileオブジェクト、trueの場合はFileオブジェクトの配列になります。Fileオブジェクトの機能については、doc\base_io.txtを参照してください。
「sum()」は、配列オブジェクトに追加された拡張メソッドで、指定プロパティの合計値を返します。
var fileArray=require('Dialog').FileDialog.show({
 directory:"D:\\bin",
 multiSelect:true,
});
alert(fileArray.sum("size"));

コマンドライン引数

コマンドライン引数で対象ファイルを指定できるようにしておけば、スクリプトファイルやショートカットのアイコンへのドラッグ&ドロップの他、「送る」メニューへの登録やコマンドプロンプトからの実行、他のソフトの外部アプリ呼び出し機能での利用など、様々な使い方が可能になります。

スクリプトへのコマンドライン引数は、「Main.params」というプロパティで配列として取得できますが、配列の各要素は単なる文字列ですので、ファイルに関する操作を行うには、Fileオブジェクトに変換してやる必要があります。 
コマンドプロンプトなどから相対パスを指定して実行した時にも対応できるように「cwd().file()」を利用するといいでしょう。「cwd()」はカレントディレクトリのDirectoryオブジェクトを得る関数、「file()」は相対/絶対パスで指定したファイルのFileオブジェクトを得るメソッドです。

コマンドライン引数で与えられたファイルの合計サイズを表示するスクリプトは、以下のようになります。
var fileArray=[];
for(var i=0,a=Main.params,l=a.length;i<l;i++){
 fileArray.push(cwd().file(a[i]));
}
alert(fileArray.sum("size"));
さらに使い勝手を高めるには、コマンドライン引数が指定されなかった場合にファイル選択ダイアログを表示するなどの処理を追加するといいでしょう。


クリップボード経由

NILScriptには、エクスプローラなどでのCtrl+Cでコピーされたファイルリストを読み取る機能が用意されています。
この機能を利用すれば、クリップボード経由で処理対象ファイルを指定する方式のスクリプトを作成可能です。
ファイル選択ダイアログやウィンドウへのドラッグ&ドロップよりも素早い操作で利用できるので、「送る」などに登録するほど利用頻度が高くないスクリプトを作る場合におすすめです。

クリップボードに格納されているファイルの配列は、下記のようにすることで取得できます。ファイルが格納されていない時はfilesがundefinedになるので、ファイル以外をコピーしている場合はゼロ個のファイルとして扱いたい場合は、「||[]」を付けて空の配列に置き換わるようにしておきます。
なお、クリップボードの内容は確認しづらいので、重大な処理を行うスクリプトでは、間違ったファイルをコピーした状態で実行してしまわないように、確認ダイアログを表示する「confirm()」などによる確認処理を組み込んでおくとよいでしょう。
var fileArray=require('Clipboard').Clipboard.files||[];
if(confirm(fileArray.join("\n"))){
 alert(fileArray.sum("size"));
}


ウィンドウへのD&D受け付け

ウィンドウを表示するタイプのツールでは、ウィンドウにファイルをドラッグ&ドロップすることでファイルを指定できるようにしておくと便利です。
本来はウィンドウを必要としない処理でも、処理対象ファイルを好きな時に指定できるようにしたい場合などは、ドラッグ&ドロップによるファイル指定を受け付けるためのウィンドウを用意するとよいでしょう。
ウィンドウへのファイルドロップを受け付けるには、Window.create()のオプションで「acceptFiles」をtrueにし、「events」の「dropFiles」にイベントハンドラ関数を指定します。
イベントハンドラの第1引数オブジェクトの「files」メンバで、ドロップされたファイルを表すFileオブジェクトの配列を取得できます。
with(require('Window')){
 Window.create({
  width:320,height:240,topmost:true,
  children:{
   edit:{
    type:Edit,multiline:true,readOnly:true,
    left:0,top:0,right:0,bottom:0,
   },
  },
  acceptFiles:true,
  events:{
   dropFiles:function(o){
    this.edit.text=o.files.join("\r\n")+"\r\n合計バイト数: "+o.files.sum("size");
   },
  },
 }).moveToCenter().show();
}

0 件のコメント:

コメントを投稿