前端培训-中级阶段(47)- Node.js 10.x 文件模块 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 article segmentfault 思否 前端培训-中级阶段(47)- Node.js 10.x 文件模块
思否
前端培训 Node.js JavaScript
转载自 SegmentFault
前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。
使用 Node.js 很大一部分的使用场景是,写个小脚本批量处理一下重复无聊的任务。比如说:
- 获取所有 json 内容,然后过滤出想要的数据。
- 把所有图片压缩一下,然后放入压缩包中。
- 把字体文件提取压缩一下。
- 把所有文件重命名一下。
这些任务中我们都需要访问文件系统,之前在浏览器环境中其实是没有文件系统概念的,今天我们来学一哈。
Node.js 文件模块
我们可以使用 fs 来操作文件系统。
const fs = require('fs');
回调方式
所有的文件系统操作都具有同步的(10.x 有,历史也有)、回调的(10.x 有,历史也有)、以及基于 promise(12.x 开始就有了,历史没有) 的形式。
同步
同步的形式会阻止 Node.js 事件循环和进一步的 JavaScript 执行,直到操作完成。
异常会被立即地抛出,可以使用 try…catch 处理,也可以冒泡。
const fs = require('fs');
try {
fs.unlinkSync('文件');
console.log('已成功地删除文件');
} catch (err) {
// 处理错误
}
异步
异步的形式总是把完成回调作为其最后一个参数。
传给完成回调的参数取决于具体方法,但第一个参数总是预留给异常。 如果操作被成功地完成,则第一个参数会为 null 或 undefined。
const fs = require('fs');
fs.unlink('文件', (err) => {
if (err) throw err;
console.log('已成功地删除文件');
});
promise
基于 Promise 的操作会返回 Promise(当异步操作完成时会被解决)。
const fs = require('fs/promises');
(async function(path) {
try {
await fs.unlink(path);
console.log(`已成功地删除文件 ${path}`);
} catch (error) {
console.error('出错:', error.message);
}
})('文件');
文件路径
支持 字符串(常用Path库就对了)、Buffer(为了兼容)、URL(需要 new URL('file:///C:/') 为入参。可以用相对路径 (process.cwd() 可以查看当前路径),绝对路径。
字符串形式
在 Windows 上,Node.js 遵循独立驱动器工作目录的概念。 当使用没有反斜杠的驱动器路径时,可以观察到此行为。 例如, fs.readdirSync('C:\\') 可能会返回与 fs.readdirSync('C:') 不同的结果。 详见此 MSDN 页面。
一般我们使用 Path 库:
- 可以直接看一下最终地址
- 可以正确使用当前系统的路径分隔符,Unix系统是”/“,Windows系统是""。
URL 形式
// 在 Windows 上:
// - 带有主机名的 WHATWG 文件的 URL 会转换为 UNC 路径。
// file://主机名/文件 => 主机名文件
fs.readFileSync(new URL('file://主机名/文件'));
// - 带有驱动器号的 WHATWG 文件的 URL 会转换为绝对路径。
// file:///C:/文件 => C:文件
fs.readFileSync(new URL('file:///C:/文件'));
API
目录 dir 类
fs.readdirSync() 同步获取目录
fs.readdir() 异步获取目录
当调用 fs.readdir() 或 fs.readdirSync()(withFileTypes 选项设置为 true)时,则生成的数组会使用 fs.Dirent 对象(而不是字符串或 Buffer)填充。
fs.mkdir(path[, options], callback) 异步地创建目录。回调会传入可能的异常、以及创建的第一个目录的路径(如果 recursive 为 true), (err, [path])。可选的 options 参数可以是整数(指定 mode(权限和粘滞位))、或对象(具有 mode 属性和 recursive 属性(指示是否要创建父目录))。 当 path 是已存在的目录时,调用 fs.mkdir() 仅在 recursive 为 false 时才会导致错误。
fs.mkdirSync(path[, options]) 同步地创建目录。 返回 undefined,或创建的第一个目录的路径(如果 recursive 为 true)。 这是 fs.mkdir() 的同步版本。
监听 fs.FSWatcher 类
fs.watch() 每当指定监视的文件被修改时,会触发 'change' 事件。
// 使用 fs.watch()监听器的示例。
fs.watch('./tmp', {
encoding: 'buffer'
}, (eventType, filename) => {
if (filename) {
console.log(filename);
}
});
读取流 fs.ReadStream 类
使用 fs.createReadStream() 函数创建并返回的 fs.ReadStream 实例。
fs.createReadStream(path[, options])
options |