不幸的是,现有答案中没有一个是完全正确的,因为readEntries不一定会返回给定目录的所有(文件或目录)条目。这是API规范的一部分(请参见下面的文档部分)。

为了真正获取所有文件,我们需要readEntries重复调用(对于遇到的每个目录),直到它返回一个空数组。如果不这样做,我们将丢失目录中的某些文件/子目录(例如在Chrome中),readEntries一次最多只能返回100个条目。

使用Promises(await/ async)可以更清楚地演示readEntries(因为它是异步的)的正确用法,并使用广度优先搜索(BFS)遍历目录结构:

// Drop handler function to get all files

async function getAllFileEntries(dataTransferItemList) {

let fileEntries = [];

// Use BFS to traverse entire directory/file structure

let queue = [];

// Unfortunately dataTransferItemList is not iterable i.e. no forEach

for (let i = 0; i < dataTransferItemList.length; i++) {

queue.push(dataTransferItemList[i].webkitGetAsEntry());

}

while (queue.length > 0) {

let entry = queue.shift();

if (entry.isFile) {

fileEntries.push(entry);

} else if (entry.isDirectory) {

queue.push(...await readAllDirectoryEntries(entry.createReader()));

}

}

return fileEntries;

}

// Get all the entries (files or sub-directories) in a directory

// by calling readEntries until it returns empty array

async function readAllDirectoryEntries(directoryReader) {

let entries = [];

let readEntries = await readEntriesPromise(directoryReader);

while (readEntries.length > 0) {

entries.push(...readEntries);

readEntries = await readEntriesPromise(directoryReader);

}

return entries;

}

// Wrap readEntries in a promise to make working with readEntries easier

// readEntries will return only some of the entries in a directory

// e.g. Chrome returns at most 100 entries at a time

async function readEntriesPromise(directoryReader) {

try {

return await new Promise((resolve, reject) => {

directoryReader.readEntries(resolve, reject);

});

} catch (err) {

console.log(err);

}

}

Codepen上的完整工作示例:https ://codepen.io/anon/pen/gBJrOP

FWIW我之所以选择它,是因为在使用接受的答案时,我没有找回包含40,000个文件的目录(许多目录包含100多个文件/子目录)的所有文件。

说明文件:

FileSystemDirectoryReader中记录了此行为。重点摘录:

readEntries()

返回一个包含一些 目录条目的数组。数组中的每个项目都是基于FileSystemEntry的对象,通常是FileSystemFileEntry或FileSystemDirectoryEntry。

但公平地说,MDN文档可以在其他部分中使这一点更加清楚。该readEntries()文件只是指出:

readEntries()方法检索正在读取的目录中的目录条目,并将它们以数组形式传递给提供的回调函数

并且唯一需要多次调用的提示是在successCallback参数的描述中:

如果没有剩余文件,或者您已经在此FileSystemDirectoryReader上调用了readEntries(),则该数组为空。

可以说该API也可以更加直观,但是如文档所述:它是一项非标准/实验性功能,不在标准轨道上,并且不能指望所有浏览器都可以使用。

有关:

johnozbay评论说,在Chrome上,readEntries一个目录(验证为Chrome 64)最多返回100个条目。

XanreadEntries很好地解释了此答案的正确用法(尽管没有代码)。

PabloBarríaUrenda的答案可以readEntries在没有BFS的情况下以异步方式正确调用。他还指出,Firefox返回目录中的所有条目(与Chrome不同),但是给定规范,我们不能依靠它。

html5拖放文件,HTML5是否允许拖放拖放文件夹或文件夹树?相关推荐

  1. 【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放

    导航 [初探HTML5之使用新标签布局]用html5布局我的博客页! [HTML5初探之form标签]解放表单验证.增加文件上传.集成拖放 [HTML5初探之绘制图像(上)]看我canvas元素引领下 ...

  2. html5 drag this,HTML5拖放(drag和drog)

    拖放(drag和drog)是HTML5的标准的组成部分,也是种常见的特性,意义为抓起一个元素放入到另外的一个位置,在HTML5中任何元素都可以被拖放,前题是要相关进行设置. 1.设置元素为可拖放,也就 ...

  3. html video拖放设置,HTML5新特性以及video和audio标签和拖放笔记

    新特性 用于绘画的canvas元素 用于媒介回访的video和audio元素 对本地离线存储更好的支持 新的特殊内容元素 article footer header nav section 新的表单控 ...

  4. 在线拖拽html,html5拖曳操作 HTML5实现网页元素的拖放操作

    HTML5之前,要实现网页元素的拖放操作,需要依靠mousedown.mousemove.mouseup等API,通过大量的JS代码来实现:HTML5中引入了直接支持拖放操作的API,大大简化了网页元 ...

  5. html5拖动图像的关键字,6.7 拖放图像 - HTML5 Canvas 实战

    本节实质上是结合前两节的概念,来演示如何拖放一副图像. 操作步骤 按照以下步骤,来拖放一副图像: 1.链接到Events类: 2. 定义writeMessage()函数,该函数输出一条消息: func ...

  6. html5批量修改本地文件名,文件名批量更名技巧;将文件夹名添加到文件名上-批量修改文件名...

    对文件批量更名的需求背景: 外出游玩,拍了很多张旅游照片,但大多数相机对拍摄的照片的命名一般是:IMG_20180706102314.jpg等样式,这种命名是没有任何意义的,只是知道是拍摄的日期时间是 ...

  7. html扩展名用于保存清单文件,HTML5 manifest ApplicationCache

    使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本. HTML5引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问 ...

  8. html5 写json 文件,HTML5实现本地JSON文件的读写

    参考: 使用HTML5来实现本地文件读取和写入  (FileReader读取json文件,FileSaver.js保存json文件) JS创建.写入.读取本地文件(txt)   (ActiveXObj ...

  9. html5视频上传云,vue+七牛云上传视频文件

    Qiniu-JavaScript-SDK基于七牛云存储官方 API 构建,其中上传功能基于 H5 File API.开发者基于 JS-SDK 可以方便的从浏览器端上传文件至七牛云存储,并对上传成功后的 ...

最新文章

  1. java书籍_这本最适合夯实基础的Java 书籍,80% 的 Java 程序员没认真看过
  2. 利物浦大学图书馆官网西交利物浦大学图书馆官网
  3. 你应该如何选择笔记软件?
  4. 7-5 图形继承与多态 (50 分)
  5. struts2 action中result参数详解
  6. nodejs express 学习
  7. Python网络框架——Web服务器
  8. uvalive3983Robtruck
  9. Win10 LSTC与Ubuntu18.04LTS双系统安装详细流程
  10. 深度相机之iPhone X选择的秘诀和方法
  11. 计算机英语 自我介绍,计算机专业学生面试英语自我介绍
  12. 蓝牙电话协议HFP(Hands-Free Profile) SCO建立/释放/在通话中Audio transfer
  13. OLTP与OLAP理解
  14. 利用Fuel-OpenStack9.0安装部署私有云平台OpenStack详细教程(上)
  15. ARP防御篇-如何揪出“内鬼”并“优雅的还手”
  16. mysql 映射到map null_mybatis处理查询map列表属性为null的问题,而导致查询map无该key对象...
  17. 软文推广高质量的新闻媒体网站都有哪些_软文管家
  18. JS获取日期(年/月/日/时/分/秒)格式转化
  19. 分享30个高品质的抽象网页背景素材
  20. 李永乐复习全书高等数学 第一章 函数、极限、连续

热门文章

  1. elasticsearch docker无法挂载_Docker 容器监控方案怎么选?看看这套开源方案
  2. Vue 2与Vue 3在自定义组件v-model上的区别
  3. 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来
  4. VS2012下基于Glut OpenGL GL_POLYGON_STIPPLE示例程序:
  5. Cocos2dx 之 ButtonSprite
  6. mysql数据库在哪里写语句_Mysql数据库操作语句
  7. Atitit.研发管理如何避免公司破产倒闭的业务魔咒
  8. using和名空间namespace
  9. CCF CSP 201604-1 折点计数
  10. Java基础-重要版本