ディレクトリのビジター関数

ディレクトリ(フォルダ)のビジター関数があると便利だなぁ・・・と思いまして、しばらく前に作ってみました。
他への依存はありません。


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);