writeFile()的回调函数的形式进行文件写入
let decodeData = decodeURIComponent(totalData); //解决中文乱码 fs.writeFile(path.join(__dirname, "/user.txt"), decodeData, err => { if (err) throw err; response.end(); }); response.end();javascript 在 es6 的之后的异步编程的形式发生了一些改变,promise 的引入让异步编程显得更加优雅
//创建file.js let fs = require("fs"); module.exports = { write: function(filename, data, options) { return new Promise((resolve, reject) => { fs.writeFile(filename, data, options, err => err === null ? resolve(filename) : reject(err) ); }); } }; //app.js let decodeData = decodeURIComponent(totalData); //解决中文乱码 write(path.join(__dirname, "/user.txt"), decodeData) .then(res => { response.end(); }) .catch(err => { throw err; });也可以使用 async/await 的方法将 promise 的异步执行转变为同步执行
request.on("end", async () => { response.writeHead(200, { "Content-type": "text/html;charset=utf-8" }); let decodeData = decodeURIComponent(totalData); //解决中文乱码 await write(path.join(__dirname, "/user.txt"), decodeData); response.end(); });此时可以使用 try...catch 进行错误捕获了
try { await write(path.join(__dirname, "/user.txt"), decodeData); response.end(); } catch (err) { console.log(err); response.end(); }为什么有同步方法了,还是要先将回调用 promise 包装后再用 async/await 将其转为同步呢?await 会阻塞 async 异步函数,但是并没有阻塞主线程,async 本质上还是异步执行,只是看起来像是一个同步执行,我们可以继续并行执行,而同步方法 sync 则不能并行执行.
追加内容 appendFile 和 appendFileSync将数据追加(在最后接着写入)到文件,如果文件尚不存在则创建该文件.data 可以是字符串或 Buffer.buffer 内容是十六进制信息的 ASCII 码
和 writeFile 不同是,writeFile 也是将内容写入文件,也是文件不存在就创建,但是文件存在的话,writeFile 写入的内容会直接覆盖原有内容,而 appendFile 是追加内容.所以新建内容还是 writeFile 比较好.
修改 file.js
append: function(filename, data, options) { return new Promise((resolve, reject) => { fs.appendFile(filename, data, options, err => err === null ? resolve(filename) : reject(err) ); }); }修改 app.js
let { write, append } = require("./file.js"); ...... "/append": async (request, response) => { response.writeHead(200, { "Content-type": "text/html;charset=utf-8" }); await append( path.join(__dirname, "/user.txt"), "我要向世界发出hello world" ); response.end(); },打开 user.txt 就发现文件的内容是 "username=我是好人&password=123456&remark=今天我要做一件事情我要向世界发出 hello world"
删除文件 fs.unlink 和 fs.unlinkSync修改 file.js
remove: function(path) { return new Promise((resolve, reject) => { fs.unlink(path, err => (err === null ? resolve(path) : reject(err))); }); }修改 app.js
"/append": async (request, response) => { response.writeHead(200, { "Content-type": "text/html;charset=utf-8" }); await remove(path.join(__dirname, "/user.txt")); await append( path.join(__dirname, "/user.txt"), "我要向世界发出hello world" ); response.end(); },这样 user.txt 中内容只有"我要向世界发出 hello world"了,可以看出来是删除文件后重新写入的
文件重命名 fs.rename()还是修改 file.js
rename: function(oldPath, newPath) { return new Promise((resolve, reject) => { fs.rename(oldPath, newPath, err => err === null ? resolve([oldPath, newPath]) : reject(err) ); }); }然后再 app.js 中执行
await rename( path.join(__dirname, "/user.txt"), path.join(__dirname, "/new_name.txt") ); 文件夹操作 mkdir,rmdir,readdirmkdir 接受三个参数,第一个是目录名,第二个是权限值,第三个是回调函数
readdir 方法用于读取目录,返回一个所包含的文件和子目录的数组
rmdir 接收一个 path 参数用于删除文件夹
新建 dir.js
let fs = require("fs"); module.exports = { mkdir: function(path, options) { return new Promise((resolve, reject) => { fs.mkdir(path, options, err => err === null ? resolve(path) : reject(err) ); }); }, readdir: function(path, options) { return new Promise((resolve, reject) => { fs.readdir(path, options, (err, files) => err === null ? resolve(files) : reject(err) ); }); }, rmdir: function(path) { return new Promise((resolve, reject) => { fs.rmdir(path, err => (err === null ? resolve(path) : reject(err))); }); }还是在 app.js 中调用
"/dir": (request, response) => { response.writeHead(200, { "Content-type": "text/html;charset=utf-8" }); ["图片", "文件", "书籍", "视频"].forEach(async item => { await mkdir(path.join(__dirname, `/${item}`)); await write( path.join(__dirname, `/${item}/${item}.txt`), "我还是要向世界发出hello world" ); console.log("我在里面"); }); console.log("我在外面"); response.end(); },文件夹此时创建成功了,控制台也会输入"我在外面,我在里面,我在里面,我在里面,我在里面".