スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



mirrorMan - 一括コピーボタン2

2ではソースの抜粋です。
mirrorManはOSのファイルシステムとリアルタイムにリンクしていません。ファイルを色分けしして画面表示してから、一括コピーボタンが押下されるまでの間にファイルが更新されている可能性があります。これをキャッチしないとたとえば次のようなことが起きかねません。
・サーバの共有ファイルが「俺が更新したのに何で古いファイルをまた上書きしてんだよ」なんて非難されてしまう。
・自分がローカルで更新したのを忘れて、うっかりサーバから上書きしてしまい、既に脳内キャッシュ領域からも消去されてしまった作業が露と消えてしまう。

そういうわけで、以下の8つのケースをコピー時にチェックしています。前回で確認ダイアログはバカだといいつつ、そういうファイルが見つかるたびにダイアログを表示して問い合わせます。

■赤いファイルのコピー時
1.赤いファイルの更新日時をコピー時にも比較する。
2.赤いファイルがコピー先に存在しない。
3.赤いファイルがコピー先のほうが新しい。
4.赤くないファイルがコピー先よりも新しい。
5.画面に表示されていないがコピー先より新しいファイルが存在した。

■青いファイルのコピー時
1.青いファイルがコピー先に存在する。
2.青くないファイルがコピー先に存在しない。
3.画面に表示されていないがコピー先に存在しないファイルが存在した。

ソースは長ったらしく、自分で見るのもちょっといやです。
役所で窓口をたらい回しにされるような気分になります。
function copyColoredFile(elmid){
var lftFol = getFolderSub(getAdrBar(0));
var rhtFol = getFolderSub(getAdrBar(2));
if(/Rht/.test(elmid)){
var objErFol = sfs.GetFolder(lftFol);
var strErFol = lftFol, strEdFol = rhtFol, strEr ="Lft";
}else{
var objErFol = sfs.GetFolder(rhtFol);
var strErFol = rhtFol, strEdFol = lftFol, strEr ="Rht";
}
var cItm,edDLM,erDLM,erItm,fcItm,intBt,itmNm,tFol;
var clr = /red/.test(elmid);
var itms = document.getElementsByTagName('PRE');
パラメータはボタンのid属性です。左右ペインのアドレスバーの値からフォルダオブジェクト、他にパス、ボタン色などを取得しています。
  for(var i in itms){
if(!itms[i].className) continue;
if((clr)&&(itms[i].className.split(" ",1)[0] =="fNmRed"+strEr)){
itmNm = itms[i].innerText;
erItm = sfs.GetFile(sfs.BuildPath(objErFol,itmNm));
if(! sfs.FileExists(sfs.BuildPath(strEdFol,itmNm))){
intBt = wsh.popup("赤いファイル "+itmNm+" がコピー先に存在しません。\n"+
"このファイルのコピーを行いますか?",0,document.title,36);
if(intBt == 7) continue;
}else{
erDLM = new Date(erItm.DateLastModified);
edDLM = new Date(sfs.GetFile(sfs.BuildPath(strEdFol, itmNm)).DateLastModified);
if(erDLM < edDLM){
wsh.popup("赤いファイル "+itmNm+"\n\nコピー先のほうが新しくなっています。"+
"\nコピーを中止します。\n\n"+
"コピー元更新日時: "+ erDLM.toLocaleString() +"\n"+
"コピー先更新日時: "+ edDLM.toLocaleString() ,0,document.title,48);
loadItms(1);
return;
}
}
tFol = ssh.NameSpace(strEdFol);
cItm = ssh.NameSpace(strErFol).ParseName(itmNm);
tFol.CopyHere(cItm, sshCpyOpt);
コピペしたら説明するモチベーションが潰えました。要は最後から2行目でCopyHere()しているというわけです。オプションパラメタのsshCpyOptの設定値(>MSDN)は、INIファイルの[cpyOpt]の値で好みで変更できます。デフォルトは80です。

    }else if((!clr)&&(itms[i].className.split(" ",1)[0] =="fNmBle"+strEr)){
itmNm = itms[i].innerText;
erItm = sfs.GetFile(sfs.BuildPath(objErFol,itmNm));
if(sfs.FileExists(sfs.BuildPath(strEdFol,itmNm))){
erDLM = new Date(erItm.DateLastModified);
edDLM = new Date(sfs.GetFile(sfs.BuildPath(strEdFol, itmNm)).DateLastModified);
intBt = wsh.popup("青いファイル "+itmNm+"\n\nコピー先に存在します。\n"+
"このファイルの上書きコピーを行いますか?\n\n"+
"コピー元更新日時: "+erDLM.toLocaleString() +"\n"+
"コピー先更新日時: "+edDLM.toLocaleString() ,0,document.title,36);
if(intBt == 7) return loadItms(1);
}
tFol = ssh.NameSpace(strEdFol);
cItm = ssh.NameSpace(strErFol).ParseName(itmNm);
tFol.CopyHere(cItm, sshCpyOpt);
}
}
要は最後から2行目でCopyHere()しているというわけです。
  for(var i=0,fcer=new Enumerator(objErFol.files); !fcer.atEnd(); fcer.moveNext(),i++){
fcItm = fcer.item().Name;
if((clr)&&(sfs.FileExists(sfs.BuildPath(strEdFol, fcItm)))){
erDLM = new Date(fcer.item().DateLastModified);
edDLM = new Date(sfs.GetFile(sfs.BuildPath(strEdFol, fcItm)).DateLastModified);
if(erDLM > edDLM){
intBt = wsh.popup("赤い表示ではないファイル\n\n"+fcItm+"\n\nコピー先より新しくなっています。\n"+
"このファイルの上書きコピーを行いますか?\n\n"+
"コピー元更新日時: "+erDLM.toLocaleString() +"\n"+
"コピー先更新日時: "+edDLM.toLocaleString() ,0,document.title,36);
if(intBt == 7) continue;
tFol = ssh.NameSpace(strEdFol);
cItm = ssh.NameSpace(strErFol).ParseName(fcItm);
tFol.CopyHere(cItm, sshCpyOpt);
}
}else if((!clr)&&(!sfs.FileExists(sfs.BuildPath(strEdFol,fcItm)))){
intBt = wsh.popup("青い表示ではないファイル "+fcItm+"\n\nコピー先に存在しません。\n"+
"このファイルのコピーを行いますか?",0,document.title,36);
if(intBt == 7) continue;
tFol = ssh.NameSpace(strEdFol);
cItm = ssh.NameSpace(sfs.GetParentFolderName(fcer.item())).ParseName(sfs.GetFileName(fcItm));
tFol.CopyHere(cItm, sshCpyOpt);
}
}
setTimeout('loadItms(1)',0);
}
コピー対象の色ではないファイルがその配色と同じ状態だった場合を探すために、もう一度ループします。今度はファイル名の色は必要ないので、フォルダオブジェクトのコレクションで全てのファイルにアクセスします。画面に表示されていないファイルをここでキャッチします。要は最後から2行目でCopyHere()しているというわけです。
スポンサーサイト



comment

Secret

while(aho.atEndofStream)

笹部 政宏
笹部 政宏
mail




フリーソフツ
Category
はてブ
Monthly Archive
New Entry
New Comment
New Trackback
RSS
Copyright © Kittens flewby me All Rights Reserved.

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。