阅读所有目录条目内容

时间:2015-08-17 01:47:54

标签: javascript html5-filesystem

我试图读取目录条目中的所有条目。我可以这样做,但是我不确定在完全完成时应该将代码放在哪里。这就是我所拥有的:

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

2 个答案:

答案 0 :(得分:1)

我能够通过保留一个计数器来确定它何时结束。

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

答案 1 :(得分:0)

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

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