首页 > 其他分享 >纯前端也可以访问文件系统!

纯前端也可以访问文件系统!

时间:2023-09-11 12:34:03浏览次数:27  
标签:返回 文件 const 对象 前端 await 文件系统 访问 目录

https://www.cnblogs.com/songyao666/p/17691691.html

 

前言

周末逛github的时候,发现我们只需要在github域名上加上1s他就能够打开一个vscode窗口来阅读代码,比起在github仓库中查看更加方便

然后我就想网页端vscode能不能打开我本地的项目呢,带着这个疑惑我打开了网页版vscode,它居然真的可以打开我本地的项目代码!

难道又出了新的API让前端的能力更进一步了?打开MDN查了一下相关文档,发现了几个新的API

showOpenFilePicker

用来选择文件

语法

showOpenFilePicker()

参数

  • options:(可选)包含以下属性
    • multiple:布尔值,默认为false。为true表示允许用户选择多个文件
    • excludeAcceptAllOption:布尔值,默认为false。默认情况下,文件选择器带有一个允许用户选择所有类型文件的过滤选项(展开于文件类型选项中)。设置此选项为 true 以使该过滤选项不可用。
    • types:表示允许选择的文件类型的数组

返回值

返回一个promise对象,会兑现一个包含 FileSystemFileHandle 对象的 Array 数组。

体验

<template>
  <div class="open_file" @click="openFile">打开文件</div>
</template>

<script setup lang="ts">
const openFile = async () => {
  const res = await window.showOpenFilePicker();
  console.log(res);
};
</script>

默认只能打开一个文件,可以传入multiple:true打开多个文件

showDirectoryPicker

用来选择目录

语法

属于浏览器全局方法,直接调用即可

showDirectoryPicker()

参数

  • options:(可选)包含以下属性
    • multiple:布尔值,默认为false。为true表示允许用户选择多个文件
    • excludeAcceptAllOption:布尔值,默认为false。默认情况下,文件选择器带有一个允许用户选择所有类型文件的过滤选项(展开于文件类型选项中)。设置此选项为 true 以使该过滤选项不可用。
    • types:表示允许选择的文件类型的数组

返回值

返回一个promise对象,会兑现一个包含 FileSystemFileHandle 对象的 Array 数组。

体验

<template>
  <div class="open_file" @click="openFile">打开文件</div>
  <div class="open_file" @click="openDir">打开文件夹</div>
</template>

<script setup lang="ts">
const openFile = async () => {
  const res = await window.showOpenFilePicker({
    // multiple: true,
  });
  console.log(res.length);
};

const openDir = async () => {
  const res = await window.showDirectoryPicker();
  console.log(res);
};
</script>

扩展

FileSystemFileHandle

FileSystemFileHandle提供了一些方法可以用来获取和操作文件

  • getFile:返回一个Promise对象,用于获取文件;

  • createSyncAccessHandle:返回一个FileSystemSyncAccessHandle对象,用于同步访问文件;

  • createWritable:返回一个Promise对象,用于创建一个可写流,用于写入文件;

FileSystemDirectoryHandle

FileSystemDirectoryHandle对象是一个代表文件系统中的目录的对象,它同样提供了方法来获取和操作目录

  • entries:返回一个AsyncIterable对象,用于获取目录中的所有文件和目录;
  • keys:返回一个AsyncIterable对象,用于获取目录中的所有文件和目录的名称;
  • values:返回一个AsyncIterable对象,用于获取目录中的所有文件和目录的FileSystemHandle对象;
  • getFileHandle:返回一个Promise对象,用于获取目录中的文件;
  • getDirectoryHandle:返回一个Promise对象,用于获取目录中的目录;
  • removeEntry:返回一个Promise对象,用于删除目录中的文件或目录;
  • resolve:返回一个Promise对象,用于获取目录中的文件或目录;

entrieskeysvalues这三个方法都是用来获取目录中的所有文件和目录的,它们返回的都是一个AsyncIterable对象,我们可以通过for await...of语法来遍历它。

开发编辑器

了解完这些知识点,我们就可以来开发一个简陋网页版编辑器了,初期只包含打开文件、打开文件夹、查看文件、切换文件

编辑器大概长这样:

打开文件夹

const openDir = async () => {
  const res = await window.showDirectoryPicker({});
  const detalAction = async (obj: any) => {
    if (obj.entries) {
      const dirs = obj.entries();
      for await (const entry of dirs) {
        if (entry[1].entries) {
          // 文件夹,递归处理
          detalAction(entry[1]);
        } else {
          // 文件
          fileList.value.push({
            name: entry[0],
            path: obj.name,
            fileHandle: entry[1],
          });
        }
      }
    }
  };
  await detalAction(res);
  showCode(fileList.value[0], 0);
  console.log("--fileList--", fileList);
};

这里主要是递归处理文件夹,返回一个文件列表

读取文件内容

const showCode = async (item: any, index: number) => {
  const file = await item.fileHandle.getFile();
  const text = await file.text();
  codeText.value = text;
  currentIndex.value = index;
};

展示文件内容

使用highlight.js来高亮展示代码

<div class="show_code">
  <pre v-highlight>
        <code class="lang-dart">
            {{ codeText }}
        </code>
   </pre>
</div>

最终效果如下:

想不到吧,这种功能现在纯前端就能够实现了,当然还可以做的更复杂一点,包括修改保存等功能,保存可以使用showSaveFilePickerAPI,它可以写入文件,同样是返回一个promise。感兴趣的可以试着完善编辑器的功能。

标签:返回,文件,const,对象,前端,await,文件系统,访问,目录
From: https://www.cnblogs.com/chinasoft/p/17693205.html

相关文章

  • 前端科普系列-Web:一路前行一路忘川
    前端科普系列-Web:一路前行一路忘川无名之辈一个有代码洁癖的前端小开发,热爱生活,追求极致​关注他 118人赞同了该文章摘要本系列文章旨在帮助学习者了解前端,主要覆盖前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前端......
  • 前端科普系列-Babel:把 ES6 送上天的通天塔
    前端科普系列-Babel:把ES6送上天的通天塔无名之辈一个有代码洁癖的前端小开发,热爱生活,追求极致​关注他 108人赞同了该文章摘要本系列文章旨在帮助学习者了解前端,主要覆盖前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学......
  • 前端科普系列-ESlint:守住优雅的护城河
    前端科普系列-ESlint:守住优雅的护城河无名之辈一个有代码洁癖的前端小开发,热爱生活,追求极致​关注他 47人赞同了该文章摘要本系列文章旨在帮助学习者了解前端,主要覆盖前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同学对前......
  • SpringBoot跨域访问
    没有引入SpringSecuity的情况Christopher2021.10.23CORS后端跨域CORS是一种访问机制,Cross-OriginResourceSharing,跨域资源共享,通过在服务器端设置相应头,把发起跨域的原始域名添加到Access-Control-Allow-Origin中即可。何为跨域域,即域名,跨域,即从域名A申请访......
  • 前端科普系列-CommonJS:不是前端却革命了前端
    前端科普系列-CommonJS:不是前端却革命了前端无名之辈一个有代码洁癖的前端小开发,热爱生活,追求极致​关注他 498人赞同了该文章摘要本系列文章旨在帮助学习者了解前端,主要覆盖前端的基础知识,但不深入讲解,定位为大而全并非细而精,适合非前端开发的同......
  • Edge浏览器没有让我失望! 今天终于可以在win10中模拟IE内核进行前端测试了,以后就用它
    ......
  • 【校招VIP】前端计算机网络之webSocket相关
    考点介绍WebSocket是一种网络通信协议,很多高级功能都需要它。初次接触WebSocket的人,都会问同样的问题:我们已经有了HTTP协议,为什么还需要另一个协议?它能带来什么好处?答案很简单,因为HTTP协议有一个缺陷:通信只能由客户端发起。答案详情解析和文章内容可点击下方链接即可查......
  • Django管理后台访问和登录页面访问数据不一致的问题
    Django管理后台访问和登录页面访问数据不一致的问题问题现象我再创建商品购物车功能后,发现这个功能页面需要放在管理后台。在测试功能时是直接配置路由访问http://localhost:8088/view_cart/是可以正常加载购物车的相关功能的,然后将购物车功能加到管理后台,添加之后发现没有查到......
  • 前端歌谣-第六课-关于this指向
    前言我是歌谣最好的种树是十年前其次是现在今天继续给大家带来的是this的讲解环境配置npminit-yyarnaddvite-D修改page.json配置端口{"name":"demo1","version":"1.0.0","description":"","main":"index.js",......
  • 4. 前端设计模式之原型模式
    PrototypePattern原型模式:在多个对象间共享相同的属性  JavaScript原生支持原型链也是实现继承的基础,如以下代码虽然是使用的ES2016新的语法classc创建的类Dog,然后又使用new实例化对象dog1、dog2、dog3,底层依然操作的原型链:classDog{constructor(name){this.name......