Для цикла, который получает имена файлов из указанной папки и всех вложенных папок — js

#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:

У вас есть довольно много вариантов, чтобы достичь результата здесь. Быстрый и грязный подход заключается в том, чтобы:

  1. устраните конфликты имен (убедитесь, что между двумя файлами нет одинаковых имен
  2. Скопируйте значения и функцию из файла B в файл A.
  3. Скопируйте вызов GetFiles сразу после сканирования().затем… вызов

Существуют и другие более чистые подходы. Но это должно привести вас к доказательству концепции того, что оба сценария могут функционировать вместе в одном сценарии.