Node学习6-fs模块
fs里面所有的方法都有同步和异步的形式。
xxxx:异步
xxxxSync:同步
异步方法中,最后一个参数都是一个回调函数,回调函数的第一个参数一般是err。
const fs = require('fs'); //删除文件 //有任何异常都会直接捕捉到err里面,不会向外抛出,也可以自行抛出 fs.unlink('/tmp/hello', (err) => { if (err) throw err; console.log('成功删除 /tmp/hello'); });
如果是同步方法,任何异常都会被立刻抛出。可以用try/catch来捕捉
onst fs = require('fs'); try { //同步方法,会一直阻塞后面的运行,直到返回 fs.unlinkSync('/tmp/hello'); console.log('successfully deleted /tmp/hello'); } catch (err) { // handle the error }
注意,异步的方法不能保证执行顺序,后面的可能会比前面的先完成。 所以下面的例子可能会出错,因为 fs.stat() 操作可能在 fs.rename() 操作之前完成。
//先改名 fs.rename('/tmp/hello', '/tmp/world', (err) => { if (err) throw err; console.log('重命名完成'); }); //再看后续的状态 fs.stat('/tmp/world', (err, stats) => { if (err) throw err; console.log(`文件属性: ${JSON.stringify(stats)}`); });
若想按正确的顺序执行操作,则需要把 fs.stat() 放到 fs.rename() 操作的回调函数中。
这样只有rename执行完之后,才会执行到stat()
//改名 fs.rename('/tmp/hello', '/tmp/world', (err) => { if (err) throw err; //查看状态 fs.stat('/tmp/world', (err, stats) => { if (err) throw err; console.log(`文件属性: ${JSON.stringify(stats)}`); }); });
如果只是一个用户的情况下,同步异步差异不大。
但是如果多用户,使用同步的方法,一个用户的等待会导致全体用户的等待。
fs.readFile:异步读文件
const data = fs.readFileSync:同步读文件
fs.writeFile:异步写文件
如果文件没有的话,会自动创建
const fs = require('fs'); const content = Buffer.from('Hello World'); //目标文件 //内容 content //错误处理 fs.writeFile('./test',content,err=>{ console.log(err); })
文件信息stats
isdir isfile
stat报错就是文件不存在
改名rename
删除unlink
读目录 readdir
新建目录mkdir
删除文件夹rmdir
监控文件watch
通过流来读写文件
和直接读好像没有什么区别,至少现在没发现。
fs.createReadStream
fs.createWriteStream
回调地狱
//回调地狱 ()=>{ ()=>{ ()=>{ ()=>{} } } }
promisify
async function