2017年4月20日木曜日

排他アクセス対象ファイルのひな形

先日公開した関数を使えば任意のファイルに対して排他的書き込みなどができます。
ただし、データそのものはただのテキストファイルですし関数も同じルールに従う関数同士でのみ仕組みが成り立つ内容になっています。

数年前に作成したプログラムで扱っているファイルに対して新たにプログラムを作成することになったのですが、排他的書き込みをコントロールしているプログラムファイルの所在が分からず(でもどこかで使われてはいる)、どういうルールだったか失念してしまい対応に苦慮しました。

そんな事が再発しないように、テキストファイル自体に書き込み用関数を入れて、いつどんなプログラムからでもその関数を使って書き込めば排他的書き込みが成立する、という雛形を作成しました。

ソース
{
文字列:"",
Write:function(path, str){
var AXO=function(n){return new ActiveXObject(n)}, fs=AXO('Scripting.FileSystemObject'), pathTMP=fs.GetSpecialFolder(2)+''
pathTMP = pathTMP.replace(/[\\\/]$/,'') + '/' + (new Date()).getTime()
fs.CreateFolder(pathTMP)
var W=function(p,s){with(fs.CreateTextFile(p)){Write(s);Close()}}
W(pathTMP+'/0.js','a='+function(){
fs = new ActiveXObject('Scripting.FileSystemObject')
R = function(p){with(fs.OpenTextFile(p)){var s=AtEndOfStream ? '' : ReadAll();Close()}; return s}
W = function(p,s){with(fs.CreateTextFile(p)){Write(s);Close()}}
P = fs.GetParentFolderName(WScript.ScriptFullName)
path = R(P+'/path')
str = R(P+'/str')
fs.DeleteFolder(P)
pathLock = path+'.lock'
flag = 0
while(!flag){
// 成功するとflagにlockフォルダのpathが入る
try{ flag = fs.CreateFolder(pathLock) }catch(e){
// lockフォルダが無いにも関わらず作成できないという場合は書き込み権限がないかPathが不正
if(!fs.FolderExists(pathLock)){return}
}
WScript.Sleep(Math.random() * 5000)
}
W(path,str)
fs.DeleteFolder(pathLock)
}+'()')
W(pathTMP+'/path',path)
W(pathTMP+'/str' ,'{\r\n\t文字列:"'+str.replace(/\\/g,'\\\\').replace(/\r/g,'\\r').replace(/\n/g,'\\n').replace(/\"/g,'\\"')+'",\r\n\tWrite:'+this.Write+'\r\n}\r\n')
AXO('WScript.Shell').Run(pathTMP+'/0.js', 0)
}
}

0 件のコメント:

コメントを投稿