Сначала я хочу описать проблему: у меня есть дерево каталогов (глубина = 3), которое содержит несколько каталогов и файлов. Некоторые из этих файлов имеют расширение .txt, а некоторые .mp4. Я хочу копировать только файлы .mp4 в новый каталог с той же иерархией, что и в исходном каталоге (другими словами, я не хочу копировать все файлы mp4 в одну папку, я хочу скопировать все каталоги как есть, а затем скопируйте mp4 файлы). Вопрос: как копировать эти файлы не последовательно, а параллельно? Вот мой код:
const fs = require('fs');
const path = require('path');
const { promisify } = require('util');
const sourceDir = process.argv[2];
const stat = promisify(fs.stat);
const copy = promisify(fs.copyFile);
const mkdir = promisify(fs.mkdir);
const readdir = promisify(fs.readdir);
const targetDir = path.join(__dirname, 'only-mp4');
// creating root folder, all files will be copied here
(async () => {
await mkdir(targetDir);
})();
const copyMediaFiles = async (node) => {
try {
const stats = await stat(node);
if (stats.isDirectory()) {
let children = await readdir(node);
// constructing new paths
children = children.map((child) => path.join(node, child));
// "copying" file hierarchy (basically just recreating same file hierarchy in target directory)
children.forEach((child) => {
const courseDirs = child.split('/').slice(4, 7).join('/');
mkdir(path.join(targetDir, courseDirs), { recursive: true });
});
// running this function for all children recursively in parallel
const promises = children.map(copyMediaFiles);
await Promise.all(promises);
}
const ext = path.extname(node);
const filename = path.basename(node);
// if file extension == mp4 then copy that file in target directory
if (ext === '.mp4') {
await copy(
node,
path.join(
targetDir,
path.dirname(node).split('/').slice(4).join('/'),
filename
)
);
console.log('File copied: ', filename);
}
return;
} catch (error) {
console.log(error);
}
};
copyMediaFiles(sourceDir).then(() => console.log('All mp4 files copied'));
Да, это работает, но я не уверен, что все сделал правильно. Любой посоветуете что? Что я тут не так сделал? И я не уверен, что правильно обхожу это дерево.