React-native-fs: как рекурсивно использовать readDir с помощью .map ()? - PullRequest
0 голосов
/ 17 марта 2020

Я попытался получить все файлы и каталоги, доступные в папке, с помощьюact-native-fs.

Я создал функцию для рекурсивного получения всех файлов и каталогов в папке. Я называю эту функцию следующим образом:

const data = await scanDir(path);

Сначала я попытался использовать .map () функция, но моя функция возвращает только некоторые элементы :

async function scanDir(pathOfDirToScan, data = {directory: [], files: []}) {
  const readedFilesAndDir = await FS.readDir(pathOfDirToScan);

  Object.keys(readedFilesAndDir).map(async key => {
    if (readedFilesAndDir[key].isDirectory()) {
      const directoryPath = pathOfDirToScan + '/' + readedFilesAndDir[key].name;
      data.directory.push(directoryPath);
      data = await scanDir(directoryPath, data);
    } else {
      data.files.push(pathOfDirToScan + '/' + readedFilesAndDir[key].name);
    }
  });

  return data;
}

Кажется, моя функция возвращает данные после первого выполнения карты времени, но функция продолжается после этого.

Затем я попытался с для l oop, и он работает как положено :

async function scanDir(pathOfDirToScan, data = {directory: [], files: []}) {
  const readedFilesAndDir = await FS.readDir(pathOfDirToScan);

  for (let i = 0; i < readedFilesAndDir.length; i++) {
    if (readedFilesAndDir[i].isDirectory()) {
      const directoryPath = pathOfDirToScan + '/' + readedFilesAndDir[i].name;
      data.directory.push(directoryPath);
      data = await scanDir(directoryPath, data);
    } else {
      data.files.push(pathOfDirToScan + '/' + readedFilesAndDir[i].name);
    }
  }

  return data;
}

Что я должен сделать, чтобы сделать функция правильно работает с использованием .map ()?

1 Ответ

0 голосов
/ 01 апреля 2020

FS.readDir(dirpath) возвращает массив объектов согласно документам . Object.keys(obj) не требуется для итерации в этом случае, просто readedFilesAndDir.map() выполнит вашу задачу.

Скопируйте и вставьте свой код с некоторыми исправлениями. Надеюсь, это поможет:

async function scanDir(pathOfDirToScan, data = {directory: [], files: []}) {
  const readedFilesAndDir = await FS.readDir(pathOfDirToScan);

  readedFilesAndDir.map(async eachItem=> {
    if (eachItem.isDirectory()) {
      const directoryPath = pathOfDirToScan + '/' + eachItem.name;
      data.directory.push(directoryPath);
      data = await scanDir(directoryPath, data);
    } else {
      data.files.push(pathOfDirToScan + '/' + eachItem.name);
    }
  });

  return data;
}
...