2025-05-12 05:38:44 +09:00

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);
}