当前位置: 首页 > news >正文

JS宏进阶:JS宏中的文件系统FileSystem

FileSystem对象中包含文件和文件夹的一些基本和常见的操作接口。比如:判断路径是否存在、创建文件夹、创建文件、读取文件等等。他的出现可以取代文件流对txt或csv等文件的操作。官方文档网址:https://open.wps.cn/previous/docs/client/wpsLoad(可点击wps宏编辑器中的帮助进入)

一、在wps编辑器中查看FileSystem中的属性和方法

function Main(){for(let key in FileSystem){console.log("方法/属性名称:" + key + " 类型:" + typeof FileSystem[key])}
}

效果图如下所示:

官方文档说明表格如下所示:

名称说明

AppendFile

往文件末尾添加数据

copyFileSync

生成文件副本

Exists

判断一个文件和文件夹是否存在。

existsSync

判断目录是否存在

Mkdir

根据给定的path创建一个文件夹。

mkdirSync

创建目录

mkdtempSync

创建临时目录

readAsBinaryString

读取指定路径的文件,返回二进制字符串数据。

readdirSync

获取目录下的子目录对象数组(包含目录相关属性)

ReadFile

获取文件的内容

readFileString

读取指定路径的文件,返回字符串。

Remove

删除指定的path所代表的文件或文件夹。

rmdirSync

删除目录

tmpdir

获取系统的临时文件目录

unlinkSync

删除文件

writeAsBinaryString

写二进制字符串对象到指定文件。

WriteFile

创建文件

writeFileString

写字符串到指定路径的文件。

二、代替Open文件流的方法详解

1、WriteFile方法

官方文档给出的语法:express.WriteFile(FilePath)

然而如果你按照该语法调用会发现:

是的,他还有第二个参数。没办法,WPS的官方文档就是这样,不能全信,但还是要看。

他的第二个参数,data:是你要写入的内容,如果创建空文件,传入空字符串即可。

function Main(){let path = "E:\\w_js\\新建";FileSystem.WriteFile(path + "\\myText.txt", "mydata");
}

当文件不存在时,会新建文件,上述代码中:如果myText.txt文件不存在于文件夹新建中,就会新建一个名称时myText.txt的文件,并写入mydata。

当文件已经存在,执行该方法时也不会报错提示文件已经创建,而是直接向已有文件中写入数据。

所以:官方文档中对WriteFile方法的解释存在问题,它不仅可以创建文件,也可以向文件中写入数据。

此外,WriteFile方法是有返回值的,返回值是boolean值,始终是ture,没什么用。

2、writeFileString方法

官方文档给出的语法:express.writeFileString(FilePathdata)

如下图所示,该语法是正确的

然而,出乎意料的是,它的作用与WriteFile一模一样,连返回值都是一样的。好在写入内容,不会像文件流一样在文本的两端添加双引号。

3、writeAsBinaryString方法

语法与上述两个方法一致,使用方法也近乎相同。不同的是,它可以写入二进制字符串对象到指定文件。示例如下:

function Main(){let path = "E:\\w_js\\新建";const buffer = new ArrayBuffer(5);const binaryData = new Uint8Array(buffer);[72, 101, 108, 108, 111].forEach((i, index)=>{binaryData[index]=i});FileSystem.writeAsBinaryString(path + "\\my.txt", binaryData);
}

显然,上述给出的是Hello的字符串编码,效果却是Hl:

是的,稀奇古怪的bug又出现了,不过,它可以使用。你不用他写入二进制字符串对象就好了。

4、追加数据的AppendFile方法

它的语法与WriteFile一致,只不过第二个参数表示追加的数据。

function Main(){let path = "E:\\w_js\\新建\\my.txt";console.log(FileSystem.AppendFile(path, "10001"));
}

输出两次true说明执行了两次,可以看到追加了两次10001.

三、判断文件或路径是否存在

1、判断文件或文件夹是否存在的Exists方法

//判断文件夹是否存在
function Main(){let path = "E:\\w_js\\新建";console.log(FileSystem.Exists(path));
}//判断文件是否存在
function Main1(){let path = "E:\\w_js\\新建";console.log(FileSystem.Exists(path + "\\my.txt"));
}

如果存在,输出true,不存在输出false。

2、判断目录是否存在的existsSync方法

existsSync与Exists的语法结构完全一致,用法也相同,输出结果也相同。

四、目录的创建与删除

1、创建文件夹的Mkdir方法

语法与全局方法MkDir相似,但是创建不成功会输出false,也就是当你尝试使用它创建多层目录时会输出false。

function Main(){let path = "E:\\w_js\\新建\\my";console.log(FileSystem.Mkdir(path));console.log(FileSystem.Mkdir("E:\\w_js\\新建\\my1\\my\\my\\my"));
}

此外还有一个作用与Mkdir完全相同的方法mkdirSync。

2、删除目录的rmdirSync

语法与Mkdir类似,只有一个参数path。如果成功删除会输出true,没有成功删除会输出false。

function Main(){let path = "E:\\w_js\\新建\\my";console.log(FileSystem.rmdirSync(path));console.log(FileSystem.rmdirSync("E:\\w_js\\新建\\my1\\my\\my\\my"));
}

与RmDir相同,它也只能删除空目录(空文件夹),而且只能删除一层。

3、删除文件的unlinkSync

它只有一个文件路径作为他的参数。示例如下:

function Main(){console.log(FileSystem.unlinkSync("E:\\w_js\\新建\\my1.txt"));
}

如果my1.txt文件存在会输出true,表示删除成功,文件不存在会输出false。

五、文件的读取

1、ReadFile方法

function Main(){console.log(FileSystem.ReadFile("E:\\w_js\\新建\\myText.txt"));
}

注意点:它在读取文件时有可能只读取出第一个字符,或者读取乱码。下面是up操作的三个示例图:

可见,只有最后一个示例它正确无误的读取了文件中的内容。据up分析与测试,该方法可能只适用于读取通过二进制写入的文件。至于具体是什么原因造成的,up也不知道,官方文档中也没有明确的解释。

2、readFileString方法

function Main(){let path = "E:\\w_js\\新建\\myText1.txt"console.log(FileSystem.readFileString(path));console.log(FileSystem.readFileString("E:\\w_js\\新建\\my.txt"));
}

注意:该方法不适用于读取二进制文件,会导致乱码

3、readAsBinaryString方法

function Main(){let path = "E:\\w_js\\新建\\myText1.txt"console.log(FileSystem.readAsBinaryString(path));console.log(FileSystem.readAsBinaryString("E:\\w_js\\新建\\my.txt"));
}

readAsBinaryString方法官方文档有解释:用于读取指定文件,返回二进制字符串数据。事实也确实如此:

4、ReadFileAsArrayBuffer方法

function Main(){let path = "E:\\w_js\\新建\\myText1.txt"console.log(JSON.stringify(FileSystem.ReadFileAsArrayBuffer(path)));
}

很明显,它返回的是一个ArrayBuffer数据。通过处理这个数据,最终可以获取文件中的内容。

六、总结

虽然该对象中的某些方法存在一些bug,但总的来说,操作文本文件或者csv文件,比文件流好用许多。对于JS宏来说,已经够用了,大家就将就将就。祝大家玩的开心。

相关文章:

JS宏进阶:JS宏中的文件系统FileSystem

FileSystem对象中包含文件和文件夹的一些基本和常见的操作接口。比如:判断路径是否存在、创建文件夹、创建文件、读取文件等等。他的出现可以取代文件流对txt或csv等文件的操作。官方文档网址:https://open.wps.cn/previous/docs/client/wpsLoad&#xf…...

XML序列化和反序列化的学习

1、基本介绍 在工作中,经常为了调通上游接口,从而对请求第三方的参数进行XML序列化,这里常使用的方式就是使用JAVA扩展包中的相关注解和类来实现xml的序列化和反序列化。 2、自定义工具类 import javax.xml.bind.JAXBContext; import javax.x…...

npm ERR! code CERT_HAS_EXPIRED

很不幸看到这个提示。 查了很多网上的解决方案,都提到一个解决方案: npm install -g npmlatest 靠就是执行install报的错,你要我通过install来解决这个问题。可见大多数人都是转发,从不自己试试。 第二个是看系统时间。这个基…...

30分钟内搭建一个全能轻量级springboot 3.4 + 脚手架 <5> 5分钟集成好caffeine并使用注解操作缓存

快速导航 <1> 5分钟快速创建一个springboot web项目 <2> 5分钟集成好最新版本的开源swagger ui&#xff0c;并使用ui操作调用接口 <3> 5分钟集成好druid并使用druid自带监控工具监控sql请求 <4> 5分钟集成好mybatisplus并使用mybatisplus generator自…...

【设计模式-结构型】装饰器模式

一、什么是装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它的核心思想是在不改变原有对象结构的情况下&#xff0c;动态地给对象增加一些功能&#xff0c;从而达到扩展功能的目的。举个例子&#xff0c;今天在家妈妈给蒸馒…...

分布式数据存储基础与HDFS操作实践(副本)

以下为作者本人撰写的报告&#xff0c;步骤略有繁琐&#xff0c;不建议作为参考内容&#xff0c;可以适当浏览&#xff0c;进一步理解。 一、实验目的 1、理解分布式文件系统的基本概念和工作原理。 2、掌握Hadoop分布式文件系统&#xff08;HDFS&#xff09;的基本操作。 …...

Linux 进程前篇(冯诺依曼体系结构和操作系统)

目录 一.冯诺依曼体系结构 1.概念 2.硬件层面的数据流 3.总结加补充 二.操作系统 (Operating System) 1.概念 2.设计OS的目的 3.定位 4.操作系统的管理 5.计算机体系的层状结构 在我们认识进程之前&#xff0c;我们先了解什么是冯诺依曼体系结构 一.冯诺依曼体系结构…...

Springboot Redisson 分布式锁、缓存、消息队列、布隆过滤器

redisson-spring-boot-starter 是 Redisson 提供的 Spring Boot 集成包&#xff0c;旨在简化与 Redis 的交互&#xff0c;包括分布式锁、缓存、消息队列、布隆过滤器等功能的实现。 Maven 依赖 在 Spring Boot 项目中添加 redisson-spring-boot-starter 依赖&#xff1a; <…...

【C语言】_字符串拷贝函数strcpy

目录 1. 函数声明及功能 2. 使用示例 3. 注意事项 4. 模拟实现 4.1 第一版&#xff1a;基本功能判空const修饰 4.2 第二版&#xff1a;优化对于\0的单独拷贝 4.3 第三版&#xff1a;仿strcpy的char*返回值 1. 函数声明及功能 char * strcpy ( char * destination, cons…...

基于 Vue 的拖拽缩放卡片组件:实现思路、方法及使用指南

引言 在前端开发中&#xff0c;实现可交互的组件能够极大地提升用户体验。本文将介绍一个基于 Vue 封装的可缩放卡片组件&#xff0c;从实现思路、代码具体实现以及使用方法等方面进行详细阐述&#xff0c;帮助开发者更好地理解和运用这一组件。项目源码地址&#xff1a;https…...

nginx 实现 正向代理、反向代理 、SSL(证书配置)、负载均衡 、虚拟域名 ,使用其他中间件监控

我们可以详细地配置 Nginx 来实现正向代理、反向代理、SSL、负载均衡和虚拟域名。同时&#xff0c;我会介绍如何使用一些中间件来监控 Nginx 的状态和性能。 1. 安装 Nginx 如果你还没有安装 Nginx&#xff0c;可以通过以下命令进行安装&#xff08;以 Ubuntu 为例&#xff0…...

Kafka客户端-“远程主机强迫关闭了一个现有的连接”故障排查及解决

Kafka客户端-“远程主机强迫关闭了一个现有的连接”故障排查及解决 1. 故障现象 Kafka客户端发送数据时&#xff0c;出现“远程主机强迫关闭了一个现有的连接”错误&#xff0c;导致数据发送失败。错误信息如下&#xff1a; 2. 故障排查 【1】. 查看服务网络状态 出现故障…...

Node.js - Express框架

1. 介绍 Express 是一个基于 Node.js 的 Web 应用程序框架&#xff0c;主要用于快速、简便地构建 Web 应用程序 和 API。它是目前最流行的 Node.js Web 框架之一&#xff0c;具有轻量级、灵活和功能丰富的特点。 核心概念包括路由&#xff0c;中间件&#xff0c;请求与响应&a…...

AWS Lambda

AWS Lambda 是 Amazon Web Services&#xff08;AWS&#xff09;提供的无服务器计算服务&#xff0c;它让开发者能够运行代码而不需要管理服务器或基础设施。AWS Lambda 会自动处理代码的执行、扩展和计费&#xff0c;开发者只需关注编写和部署代码&#xff0c;而无需担心底层硬…...

mysql 如何快速删除表数据

在数据库管理中, 经常会遇到需要删除大量数据的情况. 对于 MySQL 数据库而言, 如何高效快速地删除数据是一个值得深入探讨的问题. 本文将详细介绍几种在 MySQL 中快速删除数据的方法及相关注意事项. delete 语句 delete 语句可以删除符合条件的指定数据, 但是在删除大量数据…...

物联网网关Web服务器--lighttpd服务器部署与应用测试

以下是在国产ARM处理器E2000飞腾派开发板上部署 lighttpd 并进行 CGI 应用开发的步骤&#xff1a; 1、lighttpd简介 Lighttpd 是一款轻量级的开源 Web 服务器软件&#xff0c;具有以下特点和功能&#xff1a; 特点 轻量级&#xff1a;Lighttpd 在设计上注重轻量级和高效性&a…...

vmware虚拟机配置ubuntu 18.04(20.04)静态IP地址

VMware版本 &#xff1a;VMware Workstation 17 Pro ubuntu版本&#xff1a;ubuntu-18.04.4-desktop-amd64 主机环境 win11 1. 修改 VMware虚拟网络编辑器 打开vmware&#xff0c;点击顶部的“编辑"菜单&#xff0c;打开 ”虚拟化网络编辑器“ 。 选择更改设置&#…...

智能家居篇 一、Win10 VM虚拟机安装 Home Assistant 手把手教学

智能家居篇 一、Win10 VM虚拟机安装 Home Assistant 手把手教学 文章目录 [智能家居篇]( )一、Win10 VM虚拟机安装 Home Assistant 手把手教学 前言一.下载Vm版本的HomeAsistant安装包 二.打开Vmware选择新建虚拟机1.选择自定义高级2.选择16.x及以上3.选择稍后安装4.根据官网的…...

Flutter插件制作、本地/远程依赖及缓存机制深入剖析(原创-附源码)

Flutter插件在开发Flutter项目的过程中扮演着重要的角色&#xff0c;我们从 ​​​​​​https://pub.dev 上下载添加到项目中的第三方库都是以包或者插件的形式引入到代码中的&#xff0c;这些第三方工具极大的提高了开发效率。 深入的了解插件的制作、发布、工作原理和缓存机…...

Python猜数小游戏

Python 实现的《猜数游戏》 介绍 本文将展示如何使用 Python 编写一个简单的《猜数游戏》。这个游戏将会生成一个1到10之间的随机数&#xff0c;用户有最多三次机会来猜测正确的数字。如果用户猜对了&#xff0c;游戏将结束并显示恭喜信息&#xff1b;如果没有猜对&#xff0…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...