读取所有目录项内容

Reading All Directory Entry Contents

本文关键字:读取      更新时间:2023-09-26

我试图读取目录条目内的所有条目。我可以这样做,但我不确定将代码放在哪里,当它完全完成时应该发生。这是我的文件:

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));
});