ただし、データそのものはただのテキストファイルですし関数も同じルールに従う関数同士でのみ仕組みが成り立つ内容になっています。
数年前に作成したプログラムで扱っているファイルに対して新たにプログラムを作成することになったのですが、排他的書き込みをコントロールしているプログラムファイルの所在が分からず(でもどこかで使われてはいる)、どういうルールだったか失念してしまい対応に苦慮しました。
そんな事が再発しないように、テキストファイル自体に書き込み用関数を入れて、いつどんなプログラムからでもその関数を使って書き込めば排他的書き込みが成立する、という雛形を作成しました。
ソース
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
文字列:"", | |
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 件のコメント:
コメントを投稿