76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			76 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | (function () { | ||
|  |   "use strict" | ||
|  | 
 | ||
|  |   var fs = require('fs'), | ||
|  |     EventEmitter = require('events').EventEmitter; | ||
|  | 
 | ||
|  |   // 2010-11-25 jorge@jorgechamorro.com
 | ||
|  |   function create (pathname, cb) { | ||
|  |     var emitter = new EventEmitter(), | ||
|  |       q = [], | ||
|  |       queue = [q], | ||
|  |       curpath; | ||
|  | 
 | ||
|  |     function walk() {  | ||
|  |       //cb(curpath);
 | ||
|  |       fs.lstat(curpath, function (err, stat) { | ||
|  |         if (err) { | ||
|  |           emitter.emit('error', curpath, err); | ||
|  |         } | ||
|  |         if (!stat) { | ||
|  |           return next(); | ||
|  |         } | ||
|  |         emitter.emit('node', curpath, stat); | ||
|  |         if (!stat.isDirectory()) { | ||
|  |           return next(); | ||
|  |         } | ||
|  |         fs.readdir(curpath, function(err, files) { | ||
|  |           if (err) { | ||
|  |             emitter.emit('error', curpath, err); | ||
|  |           } | ||
|  |           // XXX bug was here. next() was omitted
 | ||
|  |           if (!files || 0 == files.length) { | ||
|  |             return next(); | ||
|  |           } | ||
|  |           files.sort(sort); | ||
|  |           emitter.emit('nodes', curpath, files); | ||
|  |           files.forEach(fullPath); | ||
|  |           queue.push(q = files); | ||
|  |           next(); | ||
|  |         }); | ||
|  |       }); | ||
|  |     } | ||
|  |      | ||
|  |     function next () { | ||
|  |       if (q.length) { | ||
|  |         curpath = q.pop(); | ||
|  |         return walk(); | ||
|  |       } | ||
|  |       if (queue.length -= 1) { | ||
|  |         q = queue[queue.length-1]; | ||
|  |         return next(); | ||
|  |       } | ||
|  |       emitter.emit('end'); | ||
|  |     } | ||
|  |      | ||
|  |     function fullPath(v,i,o) { | ||
|  |       o[i]= [curpath, '/', v].join(''); | ||
|  |     } | ||
|  |      | ||
|  |     function sort(a,b) { | ||
|  |       a= a.toLowerCase(); | ||
|  |       b= b.toLowerCase(); | ||
|  |       if (a > b) return -1; | ||
|  |       if (a < b) return  1; | ||
|  |       else       return  0; | ||
|  |     } | ||
|  | 
 | ||
|  |     curpath = pathname; | ||
|  |     walk(); | ||
|  |      | ||
|  |     return emitter; | ||
|  |   } | ||
|  | 
 | ||
|  |   module.exports = create; | ||
|  | }()); |