#javascript #node.js #for-loop
Вопрос:
У меня есть два js-скрипта, которые я хотел бы объединить в один, но я не знаю, как это сделать.
Первый сценарий загружает все файлы из указанной папки в virustotal, сканирует их и возвращает результат сканирования.
Сценарий второй, перечисляет все файлы в указанной папке и все ее подпапки.
Я хотел бы создать скрипт, который загружает все файлы в указанную папку и все ее подпапки в virustotal, сканирует их и возвращает результат сканирования.
Как бы я это сделал?
Сценарий первый:
/*jshint esversion: 8 */
const path = require('path');
const fsp = require('fs').promises;
const VirusTotalApi = require("virustotal-api");
const virusTotal = new VirusTotalApi('<YOUR API KEY>');
const basePath = '/home/username/Desktop/TEST/';
const wait = (time) => new Promise((resolve) => setTimeout(resolve, time));
async function scan() {
const files = await fsp.readdir(basePath);
let errors = [];
for (let file of files) {
const fullPath = path.join(basePath, file);
console.log(file);
try {
const data = await fsp.readFile(fullPath);
const response = await virusTotal.fileScan(data, file);
const resource = response.resource;
const result = await virusTotal.fileReport(resource);
const resultLine = `${file}: ${JSON.stringify(result, ["verbose_msg","total","positives"])}n`;
await fsp.appendFile('Result.txt', resultLine);
console.log(`${file}: Saved!`);
} catch (e) {
// collect the error, log the error and continue the loop
e.fullPath = fullPath;
errors.push(e);
console.log(`Error processing ${fullPath}`, e);
continue;
}
// Wait for 30 seconds
await wait(30000);
}
// if there was an error, then reject with all the errors we got
if (errors.length) {
let e = new Error("Problems scanning files");
e.allErrors = errors;
throw e;
}
}
scan().then(() => {
console.log("all done scanning - no errors");
}).catch(err => {
console.log(err);
});
Сценарий второй:
const { promisify } = require('util');
const { resolve } = require('path');
const fs = require('fs');
const readdir = promisify(fs.readdir);
const stat = promisify(fs.stat);
async function getFiles(dir) {
const subdirs = await readdir(dir);
const files = await Promise.all(subdirs.map(async (subdir) => {
const res = resolve(dir, subdir);
return (await stat(res)).isDirectory() ? getFiles(res) : res;
}));
return files.reduce((a, f) => a.concat(f), []);
}
getFiles('/home/username/Desktop/TEST')
.then(files => console.log(files))
.catch(e => console.error(e));
Ответ №1:
У вас есть довольно много вариантов, чтобы достичь результата здесь. Быстрый и грязный подход заключается в том, чтобы:
- устраните конфликты имен (убедитесь, что между двумя файлами нет одинаковых имен
- Скопируйте значения и функцию из файла B в файл A.
- Скопируйте вызов GetFiles сразу после сканирования().затем… вызов
Существуют и другие более чистые подходы. Но это должно привести вас к доказательству концепции того, что оба сценария могут функционировать вместе в одном сценарии.