| 1 | 1 | 'use strict'; |
| 2 | | |
| 3 | 1 | var fs; |
| 4 | | |
| 5 | 1 | try { |
| 6 | 1 | fs = require('graceful-fs'); |
| 7 | | } catch (e) { |
| 8 | 1 | fs = require('fs'); |
| 9 | | } |
| 10 | | |
| 11 | 1 | exports = module.exports = function (src, dest, cb) { |
| 12 | 2 | function next(err) { |
| 13 | 2 | if (!done) { |
| 14 | 2 | done = true; |
| 15 | 2 | cb(err); |
| 16 | | } |
| 17 | | } |
| 18 | | |
| 19 | 2 | var done = false |
| 20 | | , read = fs.createReadStream(src) |
| 21 | | , write = fs.createWriteStream(dest); |
| 22 | | |
| 23 | 2 | write |
| 24 | | .on('error', next) |
| 25 | | .on('close', next); |
| 26 | | |
| 27 | 2 | read |
| 28 | | .on('error', next) |
| 29 | | .pipe(write); |
| 30 | | }; |
| 31 | | |
| 32 | | // magic number. number of bytes allowed to be read |
| 33 | | // at a time. we're limiting this, as memory overflows |
| 34 | | // are likely to happen when reading large files |
| 35 | | // synchronously. |
| 36 | 1 | var MAX_BUFFER = 1024; |
| 37 | | |
| 38 | 1 | exports.sync = function (src, dest) { |
| 39 | 2 | if (!fs.existsSync(src)) { |
| 40 | 1 | throw new Error('no such file or directory: ' + src); |
| 41 | | } |
| 42 | | |
| 43 | 1 | var buffer = new Buffer(MAX_BUFFER) |
| 44 | | , bytesRead = MAX_BUFFER |
| 45 | | , position = 0 |
| 46 | | , read = fs.openSync(src, 'r') |
| 47 | | , write = fs.openSync(dest, 'w'); |
| 48 | | |
| 49 | 1 | while (bytesRead === MAX_BUFFER) { |
| 50 | 1 | bytesRead = fs.readSync(read, buffer, 0, MAX_BUFFER, position); |
| 51 | 1 | fs.writeSync(write, buffer, 0, bytesRead); |
| 52 | 1 | position += bytesRead; |
| 53 | | } |
| 54 | | |
| 55 | 1 | fs.closeSync(read); |
| 56 | 1 | fs.closeSync(write); |
| 57 | | }; |