スポンサーサイト

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



mirrorMan - ドライブ割当て

Windowsサーバはドライブを割り当てるほうがアクセスが速いし安定している、気がする。
のでドライブを割り当てています。

画面上では\\(バックスラッシュ)で始まるUNCパスで表示していますが、


ドライブも割り当てています。


内部で処理するのに気を付けた点は、
* ユーザはドライブ文字を意識しない。
* 親ディレクトリで割り当てられたドライブがあればそれを使う。
* 終了時に一括して切断する。

1つめは、空いているドライブ文字を検索してから割り当てます。
2つめは、割り当てパスとの前方一致でチェックします。
3つめは、mirrorMan自身で割り当てたドライブを繰り返し処理で切断します。

 1|function chkMapping(path){
2| if(!ssh.NameSpace(path)) return path;
3| if(!sfs.GetDriveName(path)) return path;
4| if(!sfs.GetDrive(sfs.GetDriveName(path)).DriveLetter){
5| var enumDrvs = (new ActiveXObject("WScript.Network")).EnumNetworkDrives();
6| for(var i=0; i<enumDrvs.length; i+=2){
7| if(!enumDrvs.Item(i)) continue;
8| if(enumDrvs.Item(i+1).toLowerCase() == path.toLowerCase())
9| return enumDrvs.Item(i)+"\\";
10| if(0==path.toLowerCase().indexOf((enumDrvs.Item(i+1)+"\\").toLowerCase())){
11| var lst = path.slice(enumDrvs.Item(i+1).length);
12| var pth = sfs.BuildPath(enumDrvs.Item(i), lst)
13| return pth;
14| }
15| }
16| for(var i=71; i<92; i++){
17| if(i == 91) return wsh.popup("ドライブが全て使用されています");
18| var d = String.fromCharCode(i);
19| if(!sfs.DriveExists(sfs.GetDriveName(d+":"))){
20| if(mapDrive(d, path)) return d+":\\";
21| else return false;
22| }
23| }
24| }else return path;
25|}
2行目はパスがNameSpace()が通るかどうかチェックしています。
3行目はドライブ文字を取得するFileSystemObjectのメソッドですが、UNCパスでもtrueが返ってきます。逆に特殊フォルダではfalseになるのでチェックに使用しています。
4行目で、ドライブ文字からドライブオブジェクトを取得できなければ、ドライブを割り当てるべきパスとしています。
5行目はドライブ文字のコレクションを取得しています。
6行目ですが、このコレクションはドライブ文字とパスのペアになっているのでi+=2で回します。
8行目では、既に割り当てたドライブがあればそのドライブを返しています。
11行目からは、親フォルダにドライブ割り当てされたパスが含まれていれば、それ以降のパスをくっつけて返しています。たとえば、\\fogeというパスがF:ドライブに割当たっているとして、\\foge\foo\だったらF:\fooというパスにして返しています。
16行目からは空いているドライブ文字が見つかるまで検索し、mapDrive()関数を呼び出しています。
 1|function mapDrive(d, path){
2| try{(new ActiveXObject("WScript.Network")).MapNetworkDrive(d+":",path,false)}
3| catch(e){return wsh.popup(e.number+":"+e.description,0,document.title,16)}
4| mappedDrv.pushDrv(d);
5| return true;
6|}
ドライブを割り当てています。割り当て後、ドライブ文字を次のオブジェクトに追加しています。
var ArrMapDrvs = function(d){
this.drvs = [];
this.pushDrv = function(d){ this.drvs.push(d) }
}
var mappedDrv = new ArrMapDrvs();
ドライブ文字を格納する配列とその配列への追加メソッドを持つオブジェクトです。
最後は、終了時に呼び出される切断処理です。
document.body.onunload = closeWin;
function closeWin(){
for(var i in mappedDrv.drvs) if(! unmapDrive(mappedDrv.drvs[i]+":")) return;
window.close();
}
ドライブ毎にunmapDrive()を呼び出してます。
 1|function unmapDrive(d){
2| try{ (new ActiveXObject("WScript.Network")).RemoveNetworkDrive(d) }
3| catch(e){
4| var sug = e.number =="-2147022492" || e.number =="-2147022495"
5| ? "切断してからmirrorManを終了するには、"+
6| d+"ドライブを使用中のファイル及びフォルダを閉じて再試行ボタンを押します。"
7| : "\n" ;
8| var btn = wsh.popup(d +" ドライブが切断できませんでした。\n\n"+
9| e.description+"\n"+ sug , 0, document.title, 69);
10| switch(btn){
11| case 3: return false;//[中止]
12| case 4: unmapDrive(d);//[再試行]
13| }
14| }
15| return true;
16|}
エラー番号はXPとVista、もしくはIE6とIE7or8で異なっています。
実際に表示されるメッセージは次のようになります。


スポンサーサイト



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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。