93 lines
1.5 KiB
JavaScript
93 lines
1.5 KiB
JavaScript
|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var fs = require('fs');
|
|
try { fs = require('graceful-fs'); } catch (e) {}
|
|
|
|
/**
|
|
* Magic number.
|
|
*/
|
|
|
|
var MAX_BUFFER = 1024;
|
|
|
|
/**
|
|
* Export `cp`.
|
|
*/
|
|
|
|
exports = module.exports = cp;
|
|
|
|
/**
|
|
* Export `sync`.
|
|
*/
|
|
|
|
exports.sync = sync;
|
|
|
|
/**
|
|
* Copy `src` to `dest`, invoking `cb(err)` when done.
|
|
*
|
|
* @param {String} src
|
|
* @param {String} dest
|
|
* @param {Function} [cb]
|
|
* @api public
|
|
*/
|
|
|
|
function cp(src, dest, cb) {
|
|
// yield support
|
|
if ('function' != typeof cb) return thunk;
|
|
|
|
var complete = false;
|
|
var read = fs.createReadStream(src);
|
|
var write = fs.createWriteStream(dest);
|
|
|
|
write.on('error', done);
|
|
write.on('close', done);
|
|
read.on('error', done);
|
|
read.pipe(write);
|
|
|
|
// done callback
|
|
function done(err) {
|
|
if (!complete) {
|
|
complete = true;
|
|
read.destroy();
|
|
write.destroy();
|
|
cb(err);
|
|
}
|
|
}
|
|
|
|
// thunk-ified
|
|
function thunk(done) {
|
|
cp(src, dest, done);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Synchronously copy file `src` to `dest`
|
|
*
|
|
* @param {String} src
|
|
* @param {String} dest
|
|
* @api public
|
|
*/
|
|
|
|
function sync(src, dest) {
|
|
if (!fs.existsSync(src)) {
|
|
throw new Error('no such file or directory: ' + src);
|
|
}
|
|
|
|
var buffer = new Buffer(MAX_BUFFER);
|
|
var bytesRead = MAX_BUFFER;
|
|
var pos = 0;
|
|
var read = fs.openSync(src, 'r');
|
|
var write = fs.openSync(dest, 'w');
|
|
|
|
while (MAX_BUFFER == bytesRead) {
|
|
bytesRead = fs.readSync(read, buffer, 0, MAX_BUFFER, pos);
|
|
fs.writeSync(write, buffer, 0, bytesRead);
|
|
pos += bytesRead;
|
|
}
|
|
|
|
fs.closeSync(read);
|
|
fs.closeSync(write);
|
|
}
|