node.js学习笔记之fs模块
2017-01-07 本文已影响838人
小母鸡叽叽叽
本文基于Node.js v6.9.4,详情请参考官网API
- 文件操作推荐使用绝对路径(__dirname + filename);
- 错误优先原则,callback 默认第一个参数都是
err
一、文件操作
// 引入fs和path模块
var fs = require('fs');
var path = require('path');
// 定义要操作的文件路径
var PATH = path.join(__dirname,'./test.json');
1. 异步读取文件
/* fs.readFile(filename[, options], callback)
* filename 必选参数,文件名
* [options] 可选参数,可指定encodeing (如'utf8');可指定flag(默认为'r',只读)
* callback 读取文件后的回调函数,参数默认第一个err, 第二个为 data
*/
fs.readFile(PATH,(err, res) => {
if(err){ return console.log(error); }
console.log('异步读取成功:'+ res);
});
**2. 同步读取文件 **
// fs.readFileSync(filename[, options])
var data = fs.readFileSync(PATH);
console.log('同步读取'+data.toString());
3. 异步写文件
// fs.writeFile(file, data[, options], callback) 请确保data是string类型
fs.writeFile(PATH,'{"a":"我是通过写入的内容"}',(err) => {
if(err){ return console.error(err);}
console.log('文件写入成功');
});
4. 同步写文件
fs.writeFileSync(file, data[, options])
5. 以追加方式异步写入文件
// fs.appendFile(filename,data,[options],callback)
fs.appendFile(PATH,'// 我只是一只小母鸡',(err) => {
if(err){return console.error(err);}
console.log('文件写入成功');
});
**6. 以追加方式同步写入文件 **
fs.appendFileSync(filename,data,[options])
7. 流式文件写入
// fs.createWriteStream(path[, options])
var streamWriter = fs.createWriteStream(path.join(__dirname,'./test.json'));
streamWriter.write('hello', () => {
console.log('写入成功!');
});
8. 文件改名
// fs.rename(oldPath, newPath, callback)
fs.rename('serve.js','http.js',(err) => {
if(err){return console.error(err);}
console.log('文件改名成功!');
});
**9. 文件异步删除 **
// fs.unlink(path, callback)
fs.unlink('./test.json', (err) => {
if(err){ console.log(err); }
console.log('文件删除成功!');
});
10. 文件同步删除
fs.unlinkSync(path)
11. 打开文件
// fs.open(path, flags[, mode], callback)
/**
* path, 必选参数,文件路径
* flags, 操作标识,如"r",读方式打开
* [mode],权限,如777,表示任何用户读写可执行
* callback 打开文件后回调函数,参数默认第一个err,第二个fd为一个整数,表示打开文件返回的文件描述符,window中又称文件句柄
*/
fs.open(PATH, 'r+', (err, fd) => {
if(err){
return console.error(err);
}
// 截取文件
fs.ftruncate(fd, 10, (err) => {
if(err){console.log(err);}
});
var buf = new Buffer(1024);
fs.read(fd, buf, 0, buf.length, 0, (err, bytes) => {
if(err){
console.log(err);
}
console.log(bytes + '字节被读取');
// 仅输出读取的字节
if(bytes >0 ){
console.log(buf.slice(0,bytes).toString());
}
// 刷新缓存
fs.fsync(fd);
// 关闭文件
fs.close(fd,(err) => {
if(err){
console.log(err);
}
console.log('文件关闭');
})
});
});
12. 文件监视
// fs.watchFile(filename[, options][, listener])
/*
* [options], persistent true表示持续监视,interval单位毫秒,表示每隔多少毫秒监视一次文件
* listener,文件变化时回调函数有两个参数,curr为一个fs.Stat对象,被修改后文件,prev,修改前fs.stat对象
* */
fs.watchFile(__dirname+'/fs.md', (curr, prev) => {
console.log('fs.md文件发生变化');
})
13. 取消监视文件
//fs.unwatchFile(filename, [listener])
/*
* filename,文件名
* listener,要取消的监听事件,如果不指定,则取消所有监听处理事件
* */
var listener = (curr, prev) => {
console.log(curr);
}
fs.unwatchFile(__dirname+'/fs.md', listener);
二、目录操作
1. 创建目录
// fs.mkdir(path, [mode], callback)
// 在当前目录下 的app目录下,创建一个js文件夹
fs.mkdir(__dirname + 'app/js', (err) => {
if(err){console.log(err);}
console.log('目录创建成功!');
});
**2. 删除目录 **
// fs.rmdir(path, callback)
fs.rmdir('app', (err) => {
if(err){return console.error(err);}
console.log('目录删除成功!');
});
3. 读取目录
// fs.readdir(path, callback)
/**
* path, 要读取目录的完整路径及目录名;
* [callback(err, files)], 读完目录回调函数;err错误对象,files数组,存放读取到的目录中的所有文件名
*/
4. 目录改名
// fs.rename(oldPath, newPath, callback)
fs.rename(__dirname + 'app/',__dirname + 'dist/',(err) => {
if(err){return console.error(err);}
console.log('文件改名成功!');
});
三、文件或目录操作
1. 监视目录或文件
fs.watch 不太稳定,在不同系统上可能有兼容性问题
// fs.watch(filename, [options], [listener])
/*
* filename 完整路径及文件名或目录名
* [options] ,可选参数,可设置编码格式encoding(如'utf8');persistent(true/false),指定进程是否继续运行,当文件被监控到变化时;recursive(true/false),指定子文件夹是否会被监控
* [listener(event, filename)],监视器事件,有两个参数,event为事件名,filename为变化的文件名
* */
var fsWatcher = fs.watch(__dirname+'/fs.md', (event, filename) =>{
console.log('event',event);
console.log('filename',filename);
})
2. 查看文件或目录是否存在
// fs.existsSync(path)
3. 查看文件或目录的信息,通常在读写文件之前使用
// fs.stat(path,callback)
/*
* callback(err, stats) 回调函数提供了两个参数,err,错误信息;stats,文件状态信息,stats还有一下方法
* */
fs.stat(__dirname+'/fs.md', (err,stats) => {
if(err){
throw Error(err)
}
// 是否文件
stats.isFile();
// 是否问文件夹
stats.isDirectory();
// 是否为块设备
stats.isBlockDevice();
// 是否为字符设备
stats.isCharacterDevice();
// 是否为FIFO
stats.isFIFO();
// 是否为Socket
stats.isSocket();
})