Как контролировать порядок архивированных каталогов и файлов с помощью «archiver.js «?

#node.js #typescript #archiverjs

#node.js #typescript #archiverjs

Вопрос:

Я использую архиватор для архивирования двух папок x и y :

 const out = ... // file write stream
...
const zip = archiver('zip', {});
zip.on('error', (err: Error) => { throw err; });

zip.pipe(out);
zip.directory('x', 'x');
zip.directory('y', 'y');
zip.finalize();
  

ZIP-файл в порядке, но unzip -l отображается x и y чередуется.
(Похоже на archiver обходы x и y в BFS-порядке).

 x/x1
x/x2
y/y1
y/y2
x/x1/x11.txt
x/x2/x21.txt
y/y1/y11.txt
  

Я бы хотел заархивировать x и y в DFS-порядок так unzip -l показывает:

 x/x1
x/x1/x11.txt
x/x2
x/x2/x21.txt
y/y1
y/y1/y11.txt
y/y2
  

Как я могу контролировать порядок архивированных каталогов и файлов?

Ответ №1:

Вы можете использовать glob() метод вместо directory() сопоставления файлов с использованием шаблона глобуса.

Это добавит файлы в DFS-order .

Инструкция должна выглядеть следующим образом:

 zip.glob('{x,y}/**/*');
  

Пример полного кода:

 import fs = require('fs');
import archiver = require('archiver');

let out = fs.createWriteStream(process.cwd()   '/example.zip');

const zip = archiver('zip', {});
zip.on('error', (err: Error) => { throw err; });

zip.pipe(out);
zip.glob('{x,y}/**/*');
zip.finalize();
  

Комментарии:

1. Спасибо за предложение, но zip, к сожалению, выглядит так же : ((

2. черт возьми, это работает так, как вы ожидаете, на моей стороне с glob()

3. Хм… очень странно.

4. Я попробовал zip.glob('x/**/*'); zip.glob('y/**/*'); , и это работает, как ожидалось :)) Спасибо!