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

ops/2025/2/23 0:20:28/

前言

周末逛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。感兴趣的可以试着完善编辑器的功能。


http://www.ppmy.cn/ops/160039.html

相关文章

ubuntu24基于虚拟机无法从主机拖拽文件夹

以下是解决问题的精简步骤&#xff1a; 安装 open-vm-tools-desktop&#xff1a; bash复制 sudo apt-get install open-vm-tools-desktop 重启虚拟机后&#xff0c;文字复制粘贴功能可正常工作。 禁用 Wayland&#xff1a; 编辑 /etc/gdm3/custom.conf 文件&#xff1a; bash复…

Access数据库教案(Excel+VBA+Access数据库/SQL Server编程)

文章目录&#xff1a; 一&#xff1a;Access基础知识 1.前言 1.1 基本流程 1.2 基本概念 2.使用步骤方法 2.1 表【设计】 2.1.1 表的理论基础 2.1.2 Access建库建表 2.1.3 表的基本操作 2.2 SQL语句代码【设计】 2.3 窗体【交互】 2.3.1 多方式创建窗体 2.3.2…

Vue3.x的深度选择器详细解读

在 Vue 3 中&#xff0c;深度选择器&#xff08;Deep Selector&#xff09;用于在 <style scoped> 中穿透作用域样式&#xff0c;影响子组件的样式。Vue 3 中深度选择器的语法与 Vue 2 有所不同&#xff0c;以下是详细说明&#xff1a; 1. 深度选择器的作用 在 Vue 的单…

视频的分片上传

分片上传需求分析&#xff1a; 项目中很多地方需要上传视频&#xff0c;如果视频很大&#xff0c;上传到服务器需要很多时间 &#xff0c;这个时候体验就会很差。所以需要前端实现分片上传的功能。 代码分析&#xff1a; html文件: <input type"file" id"…

[网络] 如何开机自动配置静态IP,并自动启动程序

背景&#xff1a; 需要固定ip地址&#xff0c;并且能够自动启动可执行文件。 流程&#xff1a; 1.在/etc/network/interfaces 中添加 auto eth0 iface eth0 inet staticaddress 192.168.1.100netmask 255.255.255.0gateway 192.168.1.1 2.将下面这行代码添加自动启动脚本 …

DeepSeek 助力 Vue 开发:打造丝滑的表单验证(Form Validation)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

【HarmonyOS NEXT】获取正式应用签名证书的签名信息

1. 背景 在接入微博SDK时&#xff0c;发现在微博开放平台中需要填写应用的签名信息。该签名信息需要填写2个&#xff0c;一个是debug【调试】证书对应的应用签名&#xff0c;一个是release【发布/线上】证书对应的应用签名。 debug环境下&#xff0c;我们可以通过微博提供的方…

30道Qt面试题(答案公布)

前五个答案 ✦ 1. Qt中常用的五大模块是哪些? Qt中常用的五大模块包括: • Qt Core:提供核心非GUI功能,如数据结构、文件操作、国际化等。 • Qt GUI:提供与平台无关的图形和基本窗口功能。 • Qt Widgets:提供用于创建传统桌面应用程序的UI组件。 • Qt Netw…