Точное совпадение строк FileName Array JavaScript / Nodejs - PullRequest
0 голосов
/ 03 апреля 2020

В настоящее время у меня есть функция findFile, которую я использую в forEach L oop, чтобы перебрать массив имен файлов и затем предоставить новый массив путей файловой системы для каждого из имен файлов в исходном массиве:

var dir = 'Some File System Path';
const fs = require('fs');

const findFile = function (dir, pattern) {
    var results = [];
    fs.readdirSync(dir).forEach(function (dirInner) {
        dirInner = path.resolve(dir, dirInner);
        var stat = fs.statSync(dirInner);
        if (stat.isDirectory()) {
            results = results.concat(findFile(dirInner, pattern));
        }
        if (stat.isFile() && dirInner.endsWith(pattern)) {
            results.push(dirInner);
        }
    });
    return results;
};

var newFileArr = ['1.txt', 'file2.txt', 'file3.txt', 'file4.txt'] 

function fpArr(newFileArr) {
  const fpArray = [];
  newFileArr.forEach((file => {
      fpArray.push(findFile(dir, file).toString())
      //console.log(fpArray)
  }));
  
OutPut:

[
/some/file/path/file1.txt,
/some/file/path/1.txt,
/some/file/path/file2.txt,
/some/file/path/file3.txt,
/some/file/path/file4.txt
]

Проблема, с которой я сталкиваюсь, заключается в том, что findFile ищет совпадение с шаблоном и выбирает путь для «1.txt», предположительно при поиске «file1.txt». ». Я знаю, что это крайний случай, но это важный крайний случай, потому что другие имена файлов могут заканчиваться теми же буквами или цифрами, и я не хочу, чтобы они были выбраны в выводе массива пути файла. Я пробовал несколько идей, таких как .match () и .startsWith, однако они будут работать только со строковым литералом или regEx, насколько я могу судить, что приводит к сбою самого поиска. Я смотрю, чтобы увидеть, есть ли способ получить функцию findFile для точного соответствия на основе переменной некоторого строкового значения? Любая помощь в правильном направлении приветствуется.

[
  'K_01.00.0000.iar',
  'HELLOWORLDKLA_01.00.0000.iar',
  'HELLO_KLA_01.00.0000.iar',
  'KLA_01.22.7895.iar',
  'KLA_HELLO_WORLD_2_01.00.0000.iar',
  'KLA_02_WORLD_01.00.0000.iar'
]
[]

Выше приведены 2 массива, с которыми я работаю. Первый массив - это просто массив имен файлов. Нижний массив прошел через syn c и ваше решение async / await. По какой-то причине даже с добавленным RegExp он по-прежнему выбирает 2 файла, которые не перечислены в массиве имени файла. Я добавил пути к файлам, чтобы показать, что ни один из файлов не находится в каталоге root, и разложил файлы по подкаталогам, чтобы убедиться, что рекурсивный поиск работает. Я буду продолжать возиться с этим, чтобы понять, смогу ли я выяснить, почему решение RegExp переносит эти файлы в массив, когда их не должно быть ...

1 Ответ

1 голос
/ 03 апреля 2020

Боюсь, у меня недостаточно репутации, чтобы комментировать, поэтому выкладываю ответ!

Ваш код работает, и если я правильно понимаю, что вы хотите найти все файлы из списка по каталог и подкаталоги, дающие вам пути к этим файлам. Это правильно?

Когда я запускаю ваш код, он действительно берет четыре файла в newFileArr и исключает 1.txt, я создал codesandbox демо, чтобы показать вам с пустышкой файлы.

Я также позволил себе создать codesandbox , который демонстрирует, как сделать это в одной функции, используя RegExp и map для создания динамических c выражений регулярных выражений, если это полезно.

...