Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

2 лет назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. const fs = require('fs-extra');
  2. const debug = require('debug')('server-connect:zip');
  3. const { basename } = require('path');
  4. const { toSystemPath, toAppPath, getFilesArray, getUniqFile } = require('../core/path');
  5. const openZip = (zipfile) => require('unzipper').Open.file(zipfile);
  6. const Zip = function(zipfile, options) {
  7. this.output = fs.createWriteStream(zipfile);
  8. this.archive = require('archiver')('zip', options);
  9. this.archive.on('warning', (err) => {
  10. if (err.code == 'ENOENT') {
  11. debug('error: %O', err);
  12. } else {
  13. throw err;
  14. }
  15. });
  16. this.archive.on('error', (err) => {
  17. throw err;
  18. });
  19. this.archive.pipe(this.output);
  20. };
  21. Zip.prototype.addFile = function(file) {
  22. this.archive.file(file, { name: basename(file) });
  23. };
  24. Zip.prototype.addDir = function(dir, recursive) {
  25. if (recursive) {
  26. this.archive.directory(dir, false);
  27. } else {
  28. this.archive.glob('*', { cwd: dir });
  29. }
  30. };
  31. Zip.prototype.save = function() {
  32. return new Promise((resolve, reject) => {
  33. this.output.on('close', resolve);
  34. this.archive.on('error', reject);
  35. this.archive.finalize();
  36. });
  37. };
  38. module.exports = {
  39. zip: async function(options) {
  40. let zipfile = toSystemPath(this.parseRequired(options.zipfile, 'string', 'zip.zip: zipfile is required.'));
  41. let files = getFilesArray(this.parseRequired(options.files, 'object', 'zip.zip: files is requires.'));
  42. let overwrite = this.parseOptional(options.overwrite, 'boolean', false);
  43. let comment = this.parseOptional(options.comment, 'string', '');
  44. if (!overwrite) zipfile = getUniqFile(zipfile);
  45. const zip = new Zip(zipfile, { comment });
  46. for (let file of files) {
  47. zip.addFile(file);
  48. }
  49. await zip.save();
  50. return toAppPath(zipfile);
  51. },
  52. zipdir: async function(options) {
  53. let zipfile = toSystemPath(this.parseRequired(options.zipfile, 'string', 'zip.zipdir: zipfile is required.'));
  54. let path = toSystemPath(this.parseRequired(options.path, 'string', 'zip.zipdir: path is required.'));
  55. let overwrite = this.parseOptional(options.overwrite, 'boolean', false);
  56. let recursive = this.parseOptional(options.recursive, 'boolean', false);
  57. let comment = this.parseOptional(options.comment, 'string', '');
  58. if (!overwrite) zipfile = getUniqFile(zipfile);
  59. const zip = new Zip(zipfile, { comment });
  60. zip.addDir(path, recursive);
  61. await zip.save();
  62. return toAppPath(zipfile);
  63. },
  64. unzip: async function(options) {
  65. let zipfile = toSystemPath(this.parseRequired(options.zipfile, 'string', 'zip.unzip: zipfile is required.'));
  66. let dest = toSystemPath(this.parseRequired(options.destination, 'string', 'zip.unzip: destination is required.'));
  67. let overwrite = this.parseOptional(options.overwrite, 'boolean', true);
  68. // TODO: overwrite option
  69. await openZip(zipfile).then(d => d.extract({ path: dest, concurrency: 4 }));
  70. return true;
  71. },
  72. dir: async function(options) {
  73. let zipfile = toSystemPath(this.parseRequired(options.zipfile, 'string', 'zip.dir: zipfile is required.'));
  74. return openZip(zipfile).then(d => {
  75. return d.files.map(file => ({
  76. type: file.type == 'Directory' ? 'dir': 'file',
  77. path: file.path,
  78. size: file.uncompressedSize,
  79. compressedSize: file.compressedSize,
  80. compressionMethod: file.compressionMethod == 8 ? 'Deflate' : 'None',
  81. lastModified: file.lastModifiedDateTime
  82. }));
  83. });
  84. },
  85. comment: async function(options) {
  86. let zipfile = toSystemPath(this.parseRequired(options.zipfile, 'string', 'zip.comment: zipfile is required.'));
  87. return openZip(zipfile).then(d => d.comment);
  88. },
  89. };