1 | 'use strict';
|
2 |
|
3 | var fs = require('fs');
|
4 |
|
5 | var SIZE = 65536;
|
6 |
|
7 | var COPYFILE_EXCL = 1;
|
8 | var COPYFILE_FICLONE = 2;
|
9 | var COPYFILE_FICLONE_FORCE = 4;
|
10 |
|
11 | var constants = {
|
12 | COPYFILE_EXCL: COPYFILE_EXCL,
|
13 | COPYFILE_FICLONE: COPYFILE_FICLONE,
|
14 | COPYFILE_FICLONE_FORCE: COPYFILE_FICLONE_FORCE,
|
15 | };
|
16 |
|
17 | module.exports = fs.copyFileSync ? fs.copyFileSync : copyFileSync;
|
18 | module.exports.constants = constants;
|
19 |
|
20 | var isNumber = function (a) { return typeof a === 'number'; };
|
21 | var or = function (a, b) { return a | b; };
|
22 | var getValue = function (obj) { return function (key) { return obj[key]; }; };
|
23 |
|
24 | var getMaxMask = function (obj) { return Object
|
25 | .keys(obj)
|
26 | .map(getValue(obj))
|
27 | .reduce(or); };
|
28 |
|
29 | var MAX_MASK = getMaxMask(constants);
|
30 | var isExcl = function (flags) { return flags & COPYFILE_EXCL; };
|
31 |
|
32 | function 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 |
|
68 | var 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 |
|
75 | function 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 |
|