Skip to content

Instantly share code, notes, and snippets.

@c4milo
Created September 8, 2010 00:24
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save c4milo/569382 to your computer and use it in GitHub Desktop.
Save c4milo/569382 to your computer and use it in GitHub Desktop.
// fs.copy(src,dst) && fs.copySync(src,dst)
var copy = function copy(src, dst, callback) {
var self = this;
if(!callback) {
callback = function(){};
}
self.on('error', function(err) {
callback(err);
});
self.on('validations', function() {
path.exists(src, function(exists) {
if(!exists) {
self.emit('error', new Error(src + ' does not exists. Nothing to be copied'));
return;
}
fs.stat(src, function(err, stat) {
if(err) {
self.emit('error', err);
return;
}
if(stat.isDirectory()) {
self.emit('error', new Error(src + ' is a directory. It must be a file'));
return;
}
if(src == dst) {
self.emit('error', new Error(src + ' and ' + dst + 'are identical'));
return;
}
//Go!
self.emit('open_infd');
});
});
});
self.on('open_infd', function() {
fs.open(src, 'r', function(err, infd) {
if(err) {
self.emit('error', err);
return;
}
self.emit('open_outfd', infd);
});
});
self.on('open_outfd', function(infd) {
fs.open(dst, 'w', function(err, outfd) {
if(err) {
self.emit('error', err);
return;
}
self.emit('sendfile', infd, outfd);
});
});
self.on('sendfile', function(infd, outfd) {
fs.fstat(infd, function(err, stat) {
if(err) {
self.emit('error', err);
return;
}
fs.sendfile(outfd, infd, 0, stat.size, function() {
self.emit('close_fds', infd, outfd);
callback();
});
});
});
self.on('close_fds', function(infd, outfd) {
fs.close(infd, function(err) {
if(err) {
self.emit('error', err);
}
});
fs.close(outfd, function(err) {
if(err) {
self.emit('error', err);
}
});
});
//Start here
self.emit('validations');
};
sys.inherits(copy, events.EventEmitter);
fs.copy = function(src, dst, callback) {
return new copy(src, dst, callback);
};
fs.copySync = function copySync(src, dst) {
if(!path.existsSync(src)) {
throw new Error(src + ' does not exists. Nothing to be copied');
}
if(fs.statSync(src).isDirectory()) {
throw new Error(src + ' is a directory. It must be a file');
}
if(src == dst) {
throw new Error(src + ' and ' + dst + 'are identical');
}
var infd = fs.openSync(src, 'r');
var size = fs.fstatSync(infd).size;
var outfd = fs.openSync(dst, 'w');
fs.sendfileSync(outfd, infd, 0, size);
fs.close(infd);
fs.close(outfd);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment