From e9991ed62c8c26ef86d6c81c1f4bb50edbc07eee Mon Sep 17 00:00:00 2001 From: defrex Date: Thu, 28 Apr 2011 14:58:09 -0400 Subject: [PATCH 1/2] added copyDirRecursive and rmdirRecursive --- lib/wrench.js | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/lib/wrench.js b/lib/wrench.js index 3ebe564..519568a 100644 --- a/lib/wrench.js +++ b/lib/wrench.js @@ -111,3 +111,84 @@ 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(); + var called = 0; + var done = function(){ + if (called == files.length) + fs.rmdir(dir, clbk); + else + called++; + }; + done(); + files.forEach(function(f){ + f = dir+f; + fs.stat(f, function(err, stat){ + if (err) return done(); + if (stat.isDirectory()) + rmdirRecursive(f, done); + else + fs.unlink(f, done); + }); + }); + }); +}; + +/* 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(){ + 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); + var called = 0; + var done = function(err){ + if (err) return clbk(err); + if (called == files.length) + clbk(); + else + called++; + }; + done(); + files.forEach(function(filename){ + var file = srcDir+'/'+filename, + newFile = newDir+'/'+filename, + called = 0; + fs.stat(file, function(err, fileStat){ + if (fileStat.isDirectory()) + copyDirRecursive(file, newFile, done); + else if (fileStat.isSymbolicLink()) + fs.readlink(file, function(err, link){ + fs.symlink(link, newFile, done); + }); + else + fs.readFile(file, function(err, data){ + fs.writeFile(newFile, data, done); + }); + }); + }); + }); + }); + }); + }); +}; From 5b71715d88878cd92408c7131a04570787d6d5b3 Mon Sep 17 00:00:00 2001 From: defrex Date: Thu, 28 Apr 2011 18:42:02 -0400 Subject: [PATCH 2/2] bug fixing --- lib/wrench.js | 75 ++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 40 deletions(-) diff --git a/lib/wrench.js b/lib/wrench.js index 519568a..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]); @@ -115,78 +115,73 @@ exports.chmodSyncRecursive = function(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(); - var called = 0; - var done = function(){ - if (called == files.length) - fs.rmdir(dir, clbk); - else - called++; - }; - done(); - files.forEach(function(f){ - f = dir+f; - fs.stat(f, function(err, stat){ - if (err) return done(); - if (stat.isDirectory()) - rmdirRecursive(f, done); - else - fs.unlink(f, done); + 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 + * 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(){ + 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); - var called = 0; - var done = function(err){ + (function copyFiles(err){ if (err) return clbk(err); - if (called == files.length) - clbk(); - else - called++; - }; - done(); - files.forEach(function(filename){ + + var filename = files.shift(); + if (filename === null || typeof filename == 'undefined') + return clbk(); + var file = srcDir+'/'+filename, - newFile = newDir+'/'+filename, - called = 0; + newFile = newDir+'/'+filename; + fs.stat(file, function(err, fileStat){ if (fileStat.isDirectory()) - copyDirRecursive(file, newFile, done); + copyDirRecursive(file, newFile, copyFiles); else if (fileStat.isSymbolicLink()) fs.readlink(file, function(err, link){ - fs.symlink(link, newFile, done); + fs.symlink(link, newFile, copyFiles); }); else fs.readFile(file, function(err, data){ - fs.writeFile(newFile, data, done); + fs.writeFile(newFile, data, copyFiles); }); }); - }); + })(); }); }); });