2010/08/20

クリップボードにファイルをコピーする

NILScriptのClipboardユニットでは、エクスプローラなどでCtrl+C/Ctrl+Vでのコピー・移動を行う時に使用されるファイルリスト形式なども扱えます。
Hotstrokesなどの機能と組み合わせれば、ファイルの管理を効率化する機能を実現するのに役立つはずです。

クリップボードにファイルをコピーするには、「Clipboard.files」というプロパティにFile/Directoryオブジェクトやファイルパス文字列、あるいはその配列を代入すればよいのですが、filesのみをセットした場合「切り取り」と「コピー」のどちらの扱いになるかが不定であることに注意しなければなりません。この状態でエクスプローラに「貼り付け」を行った場合、エクスプローラから「切り取り」していた時と同じように、ファイルが移動されてしまいます。

移動ではなくコピーにしたい場合、複数の形式を同時にセットできる「contents」プロパティを使って、「isMove」という形式と共にセットします。
isMoveは、その名の通り「移動」扱いにするかどうかを表す情報で、真偽値として読み書きできます。
下記のようにすれば、指定のファイルを「コピー」扱いでクリップボードに格納できます。
var Clipboard=require('Clipboard').Clipboard;
var f=Main.directory.file('readme.txt');
Clipboard.contents={isMove:false, files:f};

クリップボードに格納されたファイルは、Clipboard.filesを参照することで、File/Directoryオブジェクトの配列として取得できます。
この時、ファイルリストがコピーされていない場合はundefinedとして取得されることに注意してください。undefinedを配列として扱おうとすると、エラーになってしまいます。
ファイルリストがコピーされていない場合は要素数ゼロの配列とみなしてしまってよい場合は、下記のように「||[]」を加えておくとよいでしょう。
var Clipboard=require('Clipboard').Clipboard;
for(var i=0, a=Clipboard.files||[], l=a.length; i<l; i++){
 println(a[i].path+'('+a[i].size+')');
}

また、下記のようにして、ファイルリスト形式が格納されている場合のみ処理を行わせるという方法もあります。
var Clipboard=require('Clipboard').Clipboard;
if(Clipboard.hasFormat('files')){
 for(var i=0, a=Clipboard.files, l=a.length; i<l; i++){
  println(a[i].path+'('+a[i].size+')');
 }
}

0 件のコメント:

コメントを投稿