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(FilePath, data)
如下图所示,该语法是正确的
然而,出乎意料的是,它的作用与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宏来说,已经够用了,大家就将就将就。祝大家玩的开心。