diff --git a/lib/wrench.js b/lib/wrench.js index 3ebe564..69685a3 100644 --- a/lib/wrench.js +++ b/lib/wrench.js @@ -1,5 +1,5 @@ /* wrench.js - * + * * A collection of various utility functions I've found myself in need of * for use with Node.js (http://nodejs.org/). This includes things like: * @@ -16,7 +16,7 @@ var fs = require("fs"); /* wrench.rmdirSyncRecursive("directory_path"); - * + * * Recursively dives through directories and obliterates everything about it. This is a * Sync-function, which blocks things until it's done. No idea why anybody would want an * Asynchronous version. :\ @@ -28,7 +28,7 @@ exports.rmdirSyncRecursive = function(path) { /* Loop through and delete everything in the sub-tree after checking it */ for(var i = 0; i < files.length; i++) { var currFile = fs.statSync(currDir + "/" + files[i]); - + if(currFile.isDirectory()) // Recursive function back to the beginning exports.rmdirSyncRecursive(currDir + "/" + files[i]); @@ -111,3 +111,79 @@ exports.chmodSyncRecursive = function(sourceDir, filemode) { /* Finally, chmod the parent directory */ fs.chmod(sourceDir, filemode); }; + + + +/* wrench.rmdirRecursive("directory_path", callback); + * + * Recursively dives through directories and obliterates everything about it. + */ +exports.rmdirRecursive = function rmdirRecursive(dir, clbk){ + fs.readdir(dir, function(err, files){ + if (err) return clbk(err); + (function rmFile(err){ + if (err) return clbk(err); + + var filename = files.shift(); + if (filename === null || typeof filename == 'undefined') + return fs.rmdir(dir, clbk); + + var file = dir+'/'+filename; + fs.stat(file, function(err, stat){ + if (err) return clbk(err); + if (stat.isDirectory()) + rmdirRecursive(file, rmFile); + else + fs.unlink(file, rmFile); + }); + })(); + }); +}; + +/* wrench.copyDirRecursive("directory_to_copy", "new_location", callback); + * + * Recursively dives through a directory and moves all its files to a new + * location. + * + * Note: Directories should be passed to this function without a trailing slash. + */ +exports.copyDirRecursive = function copyDirRecursive(srcDir, newDir, clbk) { + fs.stat(newDir, function(err, newDirStat){ + if (!err) return exports.rmdirRecursive(newDir, function(err){ + copyDirRecursive(srcDir, newDir, clbk); + }); + + fs.stat(srcDir, function(err, srcDirStat){ + if (err) return clbk(err); + fs.mkdir(newDir, srcDirStat.mode, function(err){ + if (err) return clbk(err); + fs.readdir(srcDir, function(err, files){ + if (err) return clbk(err); + (function copyFiles(err){ + if (err) return clbk(err); + + var filename = files.shift(); + if (filename === null || typeof filename == 'undefined') + return clbk(); + + var file = srcDir+'/'+filename, + newFile = newDir+'/'+filename; + + fs.stat(file, function(err, fileStat){ + if (fileStat.isDirectory()) + copyDirRecursive(file, newFile, copyFiles); + else if (fileStat.isSymbolicLink()) + fs.readlink(file, function(err, link){ + fs.symlink(link, newFile, copyFiles); + }); + else + fs.readFile(file, function(err, data){ + fs.writeFile(newFile, data, copyFiles); + }); + }); + })(); + }); + }); + }); + }); +};