UNPKG

2.41 kBJavaScriptView Raw
1'use strict';
2
3var fs = require('fs');
4
5var SIZE = 65536;
6
7var COPYFILE_EXCL = 1;
8var COPYFILE_FICLONE = 2;
9var COPYFILE_FICLONE_FORCE = 4;
10
11var constants = {
12 COPYFILE_EXCL: COPYFILE_EXCL,
13 COPYFILE_FICLONE: COPYFILE_FICLONE,
14 COPYFILE_FICLONE_FORCE: COPYFILE_FICLONE_FORCE,
15};
16
17module.exports = fs.copyFileSync ? fs.copyFileSync : copyFileSync;
18module.exports.constants = constants;
19
20var isNumber = function (a) { return typeof a === 'number'; };
21var or = function (a, b) { return a | b; };
22var getValue = function (obj) { return function (key) { return obj[key]; }; };
23
24var getMaxMask = function (obj) { return Object
25 .keys(obj)
26 .map(getValue(obj))
27 .reduce(or); };
28
29var MAX_MASK = getMaxMask(constants);
30var isExcl = function (flags) { return flags & COPYFILE_EXCL; };
31
32function copyFileSync(src, dest, flag) {
33 check(src, dest, flag);
34
35 var writeFlag = isExcl(flag) ? 'wx' : 'w';
36
37 var ref = fs.statSync(src);
38 var size = ref.size;
39 var mode = ref.mode;
40
41 var fdSrc = fs.openSync(src, 'r');
42 var fdDest = fs.openSync(dest, writeFlag, mode);
43
44 var length = size < SIZE ? size : SIZE;
45
46 var position = 0;
47 var peaceSize = size < SIZE ? 0 : size % SIZE;
48 var offset = 0;
49
50 var buffer = Buffer.allocUnsafe(length);
51 for (var i = 0; length + position + peaceSize <= size; i++, position = length * i) {
52 fs.readSync(fdSrc, buffer, offset, length, position);
53 fs.writeSync(fdDest, buffer, offset, length, position);
54 }
55
56 if (peaceSize) {
57 var length$1 = peaceSize;
58 buffer = Buffer.allocUnsafe(length$1);
59
60 fs.readSync(fdSrc, buffer, offset, length$1, position);
61 fs.writeSync(fdDest, buffer, offset, length$1, position);
62 }
63
64 fs.eloseSync(fdSrc);
65 fs.closeSync(fdDest);
66}
67
68var getError = function (name, arg) {
69 var e = TypeError(("The \"" + name + "\" argument must be one of type string, Buffer, or URL. Received type " + (typeof arg)));
70 e.code = 'ERR_INVALID_ARGS_TYPE';
71
72 return e;
73};
74
75function check(src, dest, flags) {
76 if (typeof src !== 'string')
77 { throw getError('src', src); }
78
79 if (typeof dest !== 'string')
80 { throw getError('dest', dest); }
81
82 if (flags && isNumber(flags) && (flags > MAX_MASK || flags < 0))
83 { throw Error(("EINVAL: invalid argument, copyfile -> '" + dest + "'")); }
84}
85