读取所有目录条目内容

Reading All Directory Entry Contents

我正在尝试读取目录条目中的所有条目。我可以做到这一点,但我不确定将完成后应该发生的代码放在哪里。这是我的:

function readcontents(folder, callback) {
  var contents = []
  function readsome(reader) {
    reader.readEntries(function(entries) {
      for(var entry of entries) {
        if(entry.isDirectory) {
          readsome(entry.createReader())
        } else {
          contents.push(entry)
        }
      }
      if(entries.length) {
        readsome(reader)
      }
    })
  }
  readsome(folder.createReader())
}

我可以通过保留计数器来确定它何时完成。

function readcontents(folder, callback) {
  var reading = 0
  var contents = []
  function readsome(reader) {
    reading = reading + 1
    reader.readEntries(function(entries) {
      reading = reading - 1
      for(var entry of entries) {
        if(entry.isDirectory) {
          readsome(entry.createReader())
        } else {
          contents.push(entry)
        }
      }
      if(entries.length) {
        readsome(reader)
      } else if(reading == 0) {
        callback(contents)
      }
    })
  }
  readsome(folder.createReader())
}
readcontents(folder, function(files) {
  console.log(files)
})

我找了很多地方来寻找这个问题的答案,但最后还是自己做了。这个函数跟踪它仍然需要读取的所有子目录,然后递归调用自身,将每个子目录添加到找到的文件列表中。当它们没有子目录时,它会回调列表。

function readDirRecursive(dir, callback) {
    const subDirs = [];
    function readDir(dir, files) {
        files = files || [];
        const reader = dir.createReader();
        reader.readEntries(entries => {
            Array.from(entries).forEach(entry => {
                if(entry.isDirectory) {
                    subDirs.push(entry);
                } else {
                    files.push(entry);
                }
            });
            if (!subDirs.length) {
                return callback(files);
            }
            readDir(subDirs.pop(), files);
        });
    }
    readDir(dir);
}

注意:要从条目中获取实际文件,您需要执行以下操作:

readDirRecursive(directory, entries => {
    entries.map(e => e.file(f => doSomethingWithFile(f));
});