読者です 読者をやめる 読者になる 読者になる

10MB以上のコピー、移動(別ドライブ間)はFastCopyで行う

Paper Plane xUI

バーストモードを設定すればFastCopyは使わなくていいかな、と思ってたんだけど、やっぱりFastCopyと*ppcfileを併用することにした。

KC_main    = {	; PPcメイン窓
C	,*script %0s\ppcfile2.js,copy
M	,*script %0s\ppcfile2.js,move
\C ,*script %0s\FastCopy.js,diff
\M ,*script %0s\FastCopy.js,move }
==ppcfile2.js==
//!*script
// 引数1: copy or move
//=============================================================================
// 引数なしは終了
if(PPx.Arguments.Length!=1){PPx.Quit();}
// 相対パス、ファイルなし、特定のファイルは終了
var arg1 = PPx.Arguments.Item(0);
var f = PPx.Extract('%C');
if(PPx.EntryMarkCount==0&&(f=='..'||f=='.'||f==''||f=='$RECYCLE.BIN'||f=='RECYCLER'||f=='System Volume Information'||f=='pagefile.sys')){
  PPx.Execute('%"' + arg1 + '"%I"ファイルがありません"');
  PPx.Quit();
}
var type = PPx.DirectoryType;
var size = PPx.EntryMarkSize + PPx.EntrySize * (PPx.EntryMarkCount==0);

if(type==96){ // 62:lzh 63:zip 96:UNxxx
  // 仮想フォルダは通常コピー
  PPx.Execute('%K"@C"');
  PPx.Quit();
}else{
  // PPc[C-Z]の存在チェック
  for(var i=67 ; i<91 ; i++){
    if(PPx.Extract('%NC'+String.fromCharCode(i))){
    var cz = true;
    break;
    }
  }
  // 移動先のPPcIDをユーザーカスタマイズに保存
  if(cz){
    PPx.Execute('*setcust _User:DestCID=%M?ppxidlist');
  }else{
    if(PPx.Extract('%N~')){
      PPx.Execute('*setcust _User:DestCID=~');
    }else{
      PPx.Execute('*setcust _User:DestCID=');
    }
  }
  // 移動元のPPcIDをユーザーカスタマイズに保存
  PPx.Execute('*setcust _User:srcCID=%n');
  // 移動先PPcIDのパス
  var Source   = PPx.Extract('%FDN%\\');
  var DestDir  = PPx.Extract('%*extract(%*getcust(_User:DestCID)"%%FDN%%\\")');
  // 10MB以上のコピー、移動(別ドライブ間)はFastCopyで行う
  var fastcopy = size > 10485760
      && (arg1=="copy"||Source.replace(/^([^\\]+|\\\\[^\\]+).*/,'$1')!=DestDir.replace(/^([^\\]+|\\\\[^\\]+).*/,'$1'));
  // 1MB以上の*ppcfileはバーストモードで行う
  var burst    = size > 1048576;
  if(fastcopy){
    if(arg1=="copy"){
      arg1 = 'diff';
    }
    var Run     = '%Oni FastCopy';
    if(PPx.Execute('%"FastCopy ' + arg1 + '"%Q"DestDir : ' + DestDir + '"')){
      PPx.Quit();
    }
    // FastCopy の終了時コマンドにPPxUpdateをセット(コピー/移動後にPPcの表示を更新)
    // "PPCW.EXE" -r -noactive -k %K%*getcust(_User:DestCID)"@^F5"%:%K%*getcust(_User:srcCID)"@^F5"
    PPx.Execute(Run
      + ' /cmd=' + arg1
      + ' /srcfile=%a*8FDC'
      + ' /to="' + DestDir + '"'
      + ' /postproc=PPxUpdate'  //終了時コマンド
      + ' /estimate'      //コピー完了時間予測
      + ' /auto_close'    //コピー終了後、自動的に終了
      + ' /error_stop'    //エラー発生時にダイアログを出し、続行するかを問い合わせる
      + ' /reparse'      //ジャンクション・マウントポイント・シンボリックリンクを(配下ではなく)それ自体をコピー
      + ' /stream=FALSE'    //副次ストリームをコピーしない
      + ' /exclude="$Recycle.Bin\\;RECYCLER\\;System Volume Information\\;Temporary Internet Files\\;Thumbs.db;desktop.ini;pagefile.sys"'
    );
  }else if(burst){
    PPx.Execute('*ppcfile ' + arg1 + ',"' + DestDir + '",/burst:on');
  }else{
    PPx.Execute('*ppcfile ' + arg1 + ',"' + DestDir + '"');
  }
  PPx.Quit();
}
==FastCopy.js==
//!*script
// 引数1: /cmd
//=============================================================================
// 引数なし、書庫内は終了
if(PPx.Arguments.Length!=1||PPx.DirectoryType==96){PPx.Quit();}
// 相対パス、ファイルなし、特定のファイルは終了
var arg1 = PPx.Arguments.Item(0);
var f = PPx.Extract('%C');
if(PPx.EntryMarkCount==0&&(f=='..'||f=='.'||f==''||f=='$RECYCLE.BIN'||f=='RECYCLER'||f=='System Volume Information'||f=='pagefile.sys')){
  PPx.Execute('%"' + arg1 + '"%I"ファイルがありません"');
  PPx.Quit();
}
// PPc[C-Z]の存在チェック
for(var i=67 ; i<91 ; i++){
  if(PPx.Extract('%NC'+String.fromCharCode(i))){
  var cz = true;
  break;
  }
}
// 移動先のPPcIDをユーザーカスタマイズに保存
if(cz){
  PPx.Execute('*setcust _User:DestCID=%M?ppxidlist');
}else{
  if(PPx.Extract('%N~')){
    PPx.Execute('*setcust _User:DestCID=~');
  }else{
    PPx.Execute('*setcust _User:DestCID=');
  }
}
// 移動元のPPcIDをユーザーカスタマイズに保存
PPx.Execute('*setcust _User:srcCID=%n');
// 移動先PPcIDのパス
var DestDir  = PPx.Extract('%*extract(%*getcust(_User:DestCID)"%%FDN%%\\")');
var Run     = '%Oi FastCopy';
PPx.Execute(Run
  + ' /cmd=' + arg1
  + ' /srcfile=%a*8FDC'
  + ' /to="' + DestDir + '"'
  + ' /postproc=PPxUpdate'  //終了時コマンド
  + ' /no_exec'      //手動で実行
  + ' /estimate'      //コピー完了時間予測
  + ' /auto_close'    //コピー終了後、自動的に終了
  + ' /error_stop'    //エラー発生時にダイアログを出し、続行するかを問い合わせる
  + ' /reparse'      //ジャンクション・マウントポイント・シンボリックリンクを(配下ではなく)それ自体をコピー
  + ' /stream=FALSE'    //副次ストリームをコピーしない
  + ' /exclude="$Recycle.Bin\\;RECYCLER\\;System Volume Information\\;Temporary Internet Files\\;Thumbs.db;desktop.ini;pagefile.sys"'
);
PPx.Execute('*fitwindow %NC,%*findwindowclass("#32770"),20');
PPx.Quit();