Задача приложения в том: что с клиента приходят архивы с файлами. Структура архивов различная. А на выходе должен получится один архив со всеми файлами.
Вот пример кода:
const fileList = req.files.file;
function moveToTemp() {
if (fileList.length > 1) {
fileList.forEach(file => {
file.mv(path.join(__dirname, '..', 'dist', 'tmp', file.name), err => {
if (err) {
console.log(err);
return res.status(500).send(err);
}
});
});
}
if(fileList.name){
console.log('single file')
}
}
await moveToTemp();
function unPack (){
fs.readdir(path.join(__dirname, '..', 'dist', 'tmp'), (err, files) => {
if(err){
console.log(err);
}
files.forEach((value => {
if(value.slice(-3) === 'rar'){
unrar(path.join(__dirname, '..', 'dist', 'tmp', value), path.join(__dirname, '..', 'dist', 'tmp'), {override: true});
}
}));
})
};
await unPack();
function unlink() {
fs.readdir(path.join(__dirname, '..', 'dist', 'tmp'), (err, files) => {
if(err){
console.log(err);
}
files.forEach((value => {
if(value.slice(-3) === 'rar'){
fs.unlink(path.join(__dirname, '..', 'dist', 'tmp', value), (err) => {
if (err) console.log(err);
});
}
}));
})
}
await unlink();
function contain(){
fs.readdir(path.join(__dirname, '..', 'dist', 'tmp'), (err, files) => {
if(err){
console.log(err);
}
files.forEach((value => {
if(fs.lstatSync(path.join(__dirname, '..', 'dist', 'tmp', value)).isDirectory()){
fs.readdir(path.join(__dirname, '..', 'dist', 'tmp', value), (err, files) => {
if(err){
console.log(err);
}
files.forEach((value => {
value.mv(path.join(__dirname, '..', 'dist', 'tmp', value), err => {
if (err) {
console.log(err);
}
});
}));
});
fs.unlink(path.join(__dirname, '..', 'dist', 'tmp', value), (err) => {
if (err) console.log(err);
});
}
}));
})
}
function lookForFolders () {
const list = fs.readdirSync(path.join(__dirname, '..', 'dist', 'temp'));
console.log(list);
fs.readdirSync(path.join(__dirname, '..', 'dist', 'temp'), (err, files) => {
if(err){
console.log(err);
}
if(files){
files.forEach(file => {
do {
contain();
} while (
fs.lstatSync(path.join(__dirname, '..', 'dist', 'tmp', file)).isDirectory()
)
});
}
})
};
await lookForFolders();
Дальше все собирается в архив.
Порядок работы был такой: принять фаллы => положить в папку => если в ней есть ''rar'' , распоковать => если есть папки, войти в каждую и переместить оттуда файлы в общу папку ''tmp'' => проверять если ли еще папки и повторять предыдущю функцию пока все вайлы не будут извелечны => собрать все файлы в архив.
Но проблема в том что, действие
проверять если ли еще папки и повторять предыдущю функцию пока все вайлы не будут извелечны он начинает делать раньше чем архив распоковался. Делал все синхронно затем асинхронно, все равно не выходит.