ディレクトリのビジター関数
ディレクトリ(フォルダ)のビジター関数があると便利だなぁ・・・と思いまして、しばらく前に作ってみました。
他への依存はありません。
var dir = (function()
{
var SHL = new ActiveXObject("WScript.Shell");
var FSO = new ActiveXObject("Scripting.FileSystemObject");
/**
* ディレクトリの直下のオブジェクトに対してビジターを動作させる
* @param visiter Function ビジター関数(第1引数にディレクトリ(フォルダ)またはファイルを受ける)
* @param base [String|Folder] ディレクトリパスまたはフォルダオブジェクト
* @param withDir [Boolean] 子のディレクトリに対してビジターを実行するかどうか(省略時はtrue)
* @param withFile [Boolean] 子のファイルに対してビジターを実行するかどうか(省略時はtrue)
*/
function dir(visiter, base, withDir, withFile)
{
if(!base)
{
base = SHL.CurrentDirectory;
}
if((typeof base) == "string")
{
base = FSO.GetFolder(base);
}
if(arguments.length <= 2)
{
withDir = true;
}
if(arguments.length <= 3)
{
withFile = true;
}
if(withDir)
{
var dirs = base.SubFolders;
if(dirs)
{
for(dirs = new Enumerator(dirs); !dirs.atEnd(); dirs.moveNext())
{
visiter(dirs.item(0));
}
}
}
if(withFile)
{
var files = base.Files;
if(files)
{
for(files = new Enumerator(files); !files.atEnd(); files.moveNext())
{
visiter(files.item(0));
}
}
}
}
return dir;
}
)();
var nest = (function(dir)
{
/**
* ルートディレクトリ以下のネストされたオブジェクトに対してビジターを動作させる
* @param visiter Function ビジター関数(第1引数にディレクトリ(フォルダ)またはファイルを受ける)
* @param root [String|Folder] ルートとするディレクトリパスまたはフォルダオブジェクト
* @param withDir [Boolean] 子のディレクトリに対してビジターを実行するかどうか(省略時はtrue)
* @param withFile [Boolean] 子のファイルに対してビジターを実行するかどうか(省略時はtrue)
*/
function nest(visiter, root, withDir, withFile)
{
if(arguments.length <= 2)
{
withDir = true;
}
if(arguments.length <= 3)
{
withFile = true;
}
dir(visiter, root, withDir, withFile);
dir(function(dir) { nest(visiter, dir, withDir, withFile); }, root, true, false);
}
return nest;
}
)(dir);
また、(上記はファイルにまとめるとして、そのファイルを)使う側でもう一度ラップするともう少しだけ便利になります。
私は引数を省略した場合はファイル名orディレクトリ名を文字列化するようにし、WSHコンソールに組み込んでみました。
dir = (function(dirV) {
return function() {
if(arguments.length <= 0) {
dirV.apply(this, [文字列化関数]);
} else {
dirV.apply(this, arguments);
}
};
})(dir);
nest = (function(nestV) {
return function() {
if(arguments.length <= 0) {
nestV.apply(this, [文字列化関数]);
} else {
nestV.apply(this, arguments);
}
};
})(nest);