JavaScript实现访问本地文件夹

这篇具有很好参考价值的文章主要介绍了JavaScript实现访问本地文件夹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这个功能放在之前是不可能实现的,因为考虑到用户的隐私,但是最近有一个新的api可以做到这一点。下面来进行一个简单的功能实现。

如何选择文件夹

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <button>打开文件夹</button>
  <script>
    var btn = document.querySelector('button');
    btn.onclick=function() {
        showDirectoryPicker()
    }
  </script>
</body>

</html>

我们调用showDirectoryPicker这个函数就可以实现一个选择文件夹的功能。

showDirectoryPicker()

  • options 可选

    选项对象,包含以下属性:id通过指定 ID,浏览器能够记住不同 ID 所对应的目录。当使用相同的 ID 打开另一个目录选择器时,选择器会打开相同的目录。mode字符串,默认为 "read",可对目录进行只读访问。设为 "readwrite" 可对目录进行读写访问。startIn一个 FileSystemHandle 对象或者代表某个众所周知的目录的字符串(如:"desktop""documents""downloads""music""pictures""videos")。用于指定选择器的起始目录。

返回值

一个 Promise 对象,会兑现一个 FileSystemDirectoryHandle (en-US) 对象。

异常

  • AbortError

    当用户直接关闭了目录选择器或选择的目录是敏感目录时将会抛出 AbortError。

js 打开文件夹,javascript,开发语言,ecmascript

如何得到文件夹中的文件/子文件夹

首先对于上面所写的东西,我们进行try catch的优化

try {
  // 获得文件夹的句柄
  const handle = await showDirectoryPicker();
}
catch {
  //用户拒绝查看文件
  alert('访问失败')
}

之后我们来看一下这个headler打印出来是什么

js 打开文件夹,javascript,开发语言,ecmascript

句柄的简单解释

对于“句柄”,在下一直停留在一知半解的认识层面,近日在下学习Windows编程,决定趁此机会将句柄彻底搞清楚。查阅了一些网络上的资料,发现网络上的讲解大概可以分为两类:一种是以比喻、类比的方式说明,这种方法虽然形象易懂,但并没有从原理上、本质上加以揭示,让人仍然想问“为什么?”、“怎么实现?”。另一种是给出源代码,无可厚非,这当然是最本质的说明了,但这样一来,又显得不够直观,初学者理解起来有一定的难度。鉴于此,在下尽微末之能,结合自己的愚见,在两者之间折中,用图解的方式来将原理呈现出来,做到一目了然。

这里需要说明:

1.这里将句柄所能标识的所有东西(如窗口、文件、画笔等)统称为“对象”。

2.图中一个小横框表示一定大小的内存区域,并不代表一个字节,如标有0X00000AC6的横框表示4个字节。

3.图解的目的是为了直观易懂,所以不一定与源码完全对应,会有一定的简化。

让我们先看图,再解释。

js 打开文件夹,javascript,开发语言,ecmascript

js 打开文件夹,javascript,开发语言,ecmascript

其中,图1是程序运行到某时刻时的内存快照,图2是程序往后运行到另一时刻时的内存快照。红色部分标出了两次的变化。

简单解释:

Windows是一个以虚拟内存为基础的操作系统,很多时候,进程的代码和数据并不全部装入内存,进程的某一段装入内存后,还可能被换出到外存,当再次需要时,再装入内存。两次装入的地址绝大多数情况下是不一样的。也就是说,同一对象在内存中的地址会变化。(对于虚拟内存不是很了解的读者,可以参考有关操作系统方面的书籍)那么,程序怎么才能准确地访问到对象呢?为了解决这个问题,Windows引入了句柄。

系统为每个进程在内存中分配一定的区域,用来存放各个句柄,即一个个32位无符号整型值(32位操作系统中)。每个32位无符号整型值相当于一个指针,指向内存中的另一个区域(我们不妨称之为区域A)。而区域A中存放的正是对象在内存中的地址。当对象在内存中的位置发生变化时,区域A的值被更新,变为当前时刻对象在内存中的地址,而在这个过程中,区域A的位置以及对应句柄的值是不发生变化的。这种机制,用一种形象的说法可以表述为:有一个固定的地址(句柄),指向一个固定的位置(区域A),而区域A中的值可以动态地变化,它时刻记录着当前时刻对象在内存中的地址。这样,无论对象的位置在内存中如何变化,只要我们掌握了句柄的值,就可以找到区域A,进而找到该对象。而句柄的值在程序本次运行期间是绝对不变的,我们(即系统)当然可以掌握它。这就是以不变应万变,按图索骥,顺藤摸瓜。

**所以,我们可以这样理解Windows **句柄:

数值上,是一个32位无符号整型值(32位系统下);逻辑上,相当于指针的指针;形象理解上,是Windows中各个对象的一个唯一的、固定不变的ID;作用上,Windows使用句柄来标识诸如窗口、位图、画笔等对象,并通过句柄找到这些对象。

下面,关于句柄,再交代一些关键性细节:

1.所谓“唯一”、“不变”是指在程序的一次运行中。如果本次运行完,关闭程序,再次启动程序运行,那么这次运行中,同一对象的句柄的值和上次运行时比较,一般是不一样的。

其实这理解起来也很自然,所谓“一把归一把,这把是这把,那把是那把,两者不相干”(“把”是形象的说法,就像打牌一样,这里指程序的一次运行)。

2.句柄是对象生成时系统指定的,属性是只读的,程序员不能修改句柄。

3.不同的系统中,句柄的大小(字节数)是不同的,可以使用sizeof()来计算句柄的大小。

4.通过句柄,程序员只能调用系统提供的服务(即API调用),不能像使用指针那样,做其它的事。

再回归正题。

处理句柄函数

async function processHandler(handle) {
  if (handle.kind==='file'){
    return handle
  }
    handle.children=[]
    const iter = await handle.entries();//获得文件夹中的所有内容
    //iter:异步迭代器
    for await (const info of iter){
      var subHandle = await processHandler(info[1]);
      handle.children.push(subHandle)
    }
    return handle
}

如何得到文件内容

const root = await processHandler(handle);
//   获得文件内容
 const file = await root.children[1].getFile();
 const reader = new FileReader();
 reader.onload=e=>{
   // 读取结果
   console.log(e.target.result)
 }
 reader.readAsText(file,'utf-8')

这里用到的就是一个很简单的文件读了。

下面是完整的代码文章来源地址https://www.toymoban.com/news/detail-764944.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <button>打开文件夹</button>
  <script>
    var btn = document.querySelector('button');
    btn.onclick=async function() {

      try {
         // 获得文件夹的句柄
         const handle = await showDirectoryPicker();
         const root = await processHandler(handle);
       //   获得文件内容
        const file = await root.children[1].getFile();
        const reader = new FileReader();
        reader.onload=e=>{
          // 读取结果
          console.log(e.target.result)
        }
        reader.readAsText(file,'utf-8')
       }
       catch {
         //用户拒绝查看文件
         alert('访问失败')
       }
    }
    async function processHandler(handle) {
      if (handle.kind==='file'){
        return handle
      }
        handle.children=[]
        const iter = await handle.entries();//获得文件夹中的所有内容
        //iter:异步迭代器
        for await (const info of iter){
          var subHandle = await processHandler(info[1]);
          handle.children.push(subHandle)
        }
        return handle
    }
  </script>
</body>

</html>

到了这里,关于JavaScript实现访问本地文件夹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity功能实现_打开Window的文件/文件夹

    🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎目标:打开Window的文件/文件夹 ☀️核心代码 GetOpenFileName和GetSaveFileName都是Windows API中的函数,它们都定义在comdlg32.dll中。这两个函数都是用来显示文件打开或保存对话框的。

    2024年02月02日
    浏览(64)
  • qt 窗口实现打开文件夹浏览资源(纯代码实现,后附代码)

     新建 widget 项目可参考 QT入门初学者——如何新建一个工程项目(详细)_guuuuug的博客-CSDN博客_qt新建工程   实现界面,点击浏览会打开文件夹 选中文件,窗口显示文件名,文件路径 过长的文字会在最后显示...,鼠标悬浮在文字栏会显示全部文字。 点击右下角打开可以实现打

    2024年02月11日
    浏览(46)
  • 打开ftp服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹,出现下面的错误提示,200 Type set to A 501 Server cannot accept argument.错误

    新建ftp服务器以后,使用用户名密码访问时,出现下面的错误提示,200 Type set to A  501 Server cannot accept argument.,如下图: 出现上述原因不是ftp服务器有问题,而是访问的客户端有问题,解决如下: 首先打开ie浏览器,然后找到  internet选项  点击 高级 设置下滑  找到  浏览

    2024年02月13日
    浏览(60)
  • Node.js:实现遍历文件夹下所有文件

    Node.js:实现遍历文件夹 代码如下 参考文章 如何使用Node.js遍历文件夹详解

    2024年02月13日
    浏览(53)
  • Mac双击无法打开文件或者文件夹

    在使用MAC过程中出现双击无法打开文件或者文件夹,这可能与鼠标连按速度有关,下面分享一下如何解决Mac鼠标双击打不开文件和文件夹的问题。 打开 系统偏好设置 打开 辅助功能 指针控制 ,将“连按速度”的滑块左右调整,同时测试双击打开文件或文件夹。

    2024年02月06日
    浏览(95)
  • 右击文件或者文件夹使用vscode打开

    平常我们在打开项目时,经常会需要快捷打开方式,直接使右键使用编辑器打开,但是有时在安装时忘记了选择 “Add “Open with Code” action to Windows Explorer file context menu” 在Windows资源管理器文件上下文菜单中添加“用代码打开”操作 Add “Open with Code” action to Windows Explorer d

    2024年02月05日
    浏览(63)
  • 在任何文件夹下打开jupyter 内核都是同一个文件夹

     我在 D:anaconda实例代码 下打开jupyter notebook  无论我在那个文件下打开jupyter 都是同一个文件这是因为你可能在jupyter notebook 的那个配置文件中设置固定的路径 假如你的.py 文件在D:anaconda实例代码 下 你想通过jupyter notebook 运行它很简单  上传到jupyter notebook本地      如何运

    2024年02月12日
    浏览(68)
  • 【C#】在Windows资源管理器打开文件夹,并选中指定的文件或文件夹

    因软件里使用了第三方插件,第三方插件的日志文件夹存在路径不止一个,并且可能层级较深。 为便于运维人员和最终用户使用,在界面上增加一个“打开XX文件夹”的按钮,点击时,打开第三方插件日志文件夹所在的上级文件夹,并选中其下级指定名称的若干个文件和文件

    2024年02月14日
    浏览(63)
  • Linux - samba实现Linux与windows文件共享——共享文件夹目标文件访问权限被拒绝解决方案(超详细,看不懂你怪我)

            最近做一个项目,需要用到linux上的内容,于是需要将linux与window共享文件,上网查阅了一些资料,做完了之后,总结一下自己遇到的问题,以及自己是咋解决的,供大家参考。 这里其实只需要一步就可以操作出来,现在我们看一下: 一、打开虚拟机,选择设置

    2024年02月04日
    浏览(66)
  • 限制Linux指定用户访问某个文件夹,禁止其访问指定文件夹

         默认情况下用户本身就只能读写执行自己目录下自己创建的文件,自己主目录以外的文件都没有写权限、执行权限;自己主目录以外的目录,则只有r和x权限,没有w权限,对于合法的ssh用户,这样的权限就已经足够了。 否则如果去该系统目录和文件的权限,可能会引起

    2024年02月06日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包