86 lines
2.4 KiB
JavaScript
86 lines
2.4 KiB
JavaScript
'use strict';
|
|
|
|
var fs = require('fs');
|
|
|
|
var SIZE = 65536;
|
|
|
|
var COPYFILE_EXCL = 1;
|
|
var COPYFILE_FICLONE = 2;
|
|
var COPYFILE_FICLONE_FORCE = 4;
|
|
|
|
var constants = {
|
|
COPYFILE_EXCL: COPYFILE_EXCL,
|
|
COPYFILE_FICLONE: COPYFILE_FICLONE,
|
|
COPYFILE_FICLONE_FORCE: COPYFILE_FICLONE_FORCE,
|
|
};
|
|
|
|
module.exports = fs.copyFileSync ? fs.copyFileSync : copyFileSync;
|
|
module.exports.constants = constants;
|
|
|
|
var isNumber = function (a) { return typeof a === 'number'; };
|
|
var or = function (a, b) { return a | b; };
|
|
var getValue = function (obj) { return function (key) { return obj[key]; }; };
|
|
|
|
var getMaxMask = function (obj) { return Object
|
|
.keys(obj)
|
|
.map(getValue(obj))
|
|
.reduce(or); };
|
|
|
|
var MAX_MASK = getMaxMask(constants);
|
|
var isExcl = function (flags) { return flags & COPYFILE_EXCL; };
|
|
|
|
function copyFileSync(src, dest, flag) {
|
|
check(src, dest, flag);
|
|
|
|
var writeFlag = isExcl(flag) ? 'wx' : 'w';
|
|
|
|
var ref = fs.statSync(src);
|
|
var size = ref.size;
|
|
var mode = ref.mode;
|
|
|
|
var fdSrc = fs.openSync(src, 'r');
|
|
var fdDest = fs.openSync(dest, writeFlag, mode);
|
|
|
|
var length = size < SIZE ? size : SIZE;
|
|
|
|
var position = 0;
|
|
var peaceSize = size < SIZE ? 0 : size % SIZE;
|
|
var offset = 0;
|
|
|
|
var buffer = Buffer.allocUnsafe(length);
|
|
for (var i = 0; length + position + peaceSize <= size; i++, position = length * i) {
|
|
fs.readSync(fdSrc, buffer, offset, length, position);
|
|
fs.writeSync(fdDest, buffer, offset, length, position);
|
|
}
|
|
|
|
if (peaceSize) {
|
|
var length$1 = peaceSize;
|
|
buffer = Buffer.allocUnsafe(length$1);
|
|
|
|
fs.readSync(fdSrc, buffer, offset, length$1, position);
|
|
fs.writeSync(fdDest, buffer, offset, length$1, position);
|
|
}
|
|
|
|
fs.closeSync(fdSrc);
|
|
fs.closeSync(fdDest);
|
|
}
|
|
|
|
var getError = function (name, arg) {
|
|
var e = TypeError(("The \"" + name + "\" argument must be one of type string, Buffer, or URL. Received type " + (typeof arg)));
|
|
e.code = 'ERR_INVALID_ARGS_TYPE';
|
|
|
|
return e;
|
|
};
|
|
|
|
function check(src, dest, flags) {
|
|
if (typeof src !== 'string')
|
|
{ throw getError('src', src); }
|
|
|
|
if (typeof dest !== 'string')
|
|
{ throw getError('dest', dest); }
|
|
|
|
if (flags && isNumber(flags) && (flags > MAX_MASK || flags < 0))
|
|
{ throw Error(("EINVAL: invalid argument, copyfile -> '" + dest + "'")); }
|
|
}
|
|
|