快速上手 - fs 文件系统模块

  • 作者:KK

  • 发表日期:2018.5.15


fs 就是 file system 的缩写,这个模块提供了一套接口让我们操作磁盘上的文件:

基本了解

let fs = require('fs');
fs.writeFileSync('D:/path/to/aaa.txt', 123); //将 123 这个内容写入 /path/to/abc.txt 中,如果没有这个文件就创建这个文件
let fileContent = fs.readFileSync('D:/path/to/aaa.txt');  //从文件中读出内容赋值给变量

console.log('文件内容', fileContent);

异步操作

nodejs 几乎为每种文件的操作都提供了2个功能相同的API,一个是同步的,执行完才会运行下一句代码,另一个是异步的,相当于ajax一样,看看:

let fs = require('fs');
fs.writeFile('aaa.txt', 123, (error) => {
	if(error){
		console.error('写入文件出错:', error)
	}else{
    	console.log('文件写入完毕');
    }
});

console.log('已经执行了写文件操作,写没写完就不知道咯');

writeFileSyncwriteFile都是写文件,Sync表示同步的,没有Sync表示异步的,调用异步操作时需要传入一个回调函数,在写完后触发这个回调,所以我就说跟ajax一样。

在 nodejs 中比较提倡使用异步操作,因为异步比同步的性能高出许多个数量级,具体的性能分析请上网搜索node 异步和同步性能,除了文件以外还有网络 API 也有异步的,以后会接触到。


常用的 API

写文件 writeFile

上面示都例过了我就不写代码了,异步writeFile(file, data[, options], callback),同步writeFileSync(file, data[, options]),而文件不存在时会自动创建。


读文件 readFile

异步:readFile(path[, options], callback)

//以utf8编码读出内容
let fs = require('fs');
fs.readFile('aaa.txt', 'utf-8', (error, content) => {
	if(error){
		console.error('读取文件出错', error);
	}else{
		console.log(content);
	}
});

//以二进制方式读出内容
fs.readFile('aaa.txt', (error, content) => {
	if(error){
		console.error('读取文件出错', error);
	}else{
		console.log(content);
	}
});

同步:readFileSync(path[, options])

let fs = require('fs');
let content = fs.readFileSync('aaa.txt', 'utf-8'); //utf8编码读出
console.log(content);

let  binaryContent = fs.readFileSync('aaa.txt'); //二进制读出
console.log(binaryContent);

获取文件摘要+判断文件是否存在 stat

以前有专门判断文件是否存在的接口,后来的版本就推荐使用stat这个方法了,它既能获取文件的摘要信息,也能判断文件是否存在

异步:stat(path, callback)

let fs = require('fs');
fs.stat('aaa.txt', (error, statInfo) => {
	if(error){
		if(error.errno === -4058){
			console.error('文件不存在', error);
		}else{
			console.error('获取文件摘要信息出错', error);
		}
	}else{
		console.log(statInfo);
	}
});

同步:statSync(path)

let fs = require('fs');
let statInfo = fs.statSync('aaa.txt');
console.log(statInfo);

删除文件 unlink

异步:unlink(path, callback)

let fs = require('fs');
fs.unlink('aaa.txt', (error) => {
	if(error){
		console.error('删除文件失败', error);
	}else{
		console.log('删除完毕');
	}
});

同步:unlinkSync(path)

let fs = require('fs');
let result = fs.unlinkSync('aaa.txt');
console.log(result);  //undefined   不会有结果返回,但一般只要不抛出异常就是正常删除了

if(!fs.statSync('aaa.txt')){
	console.log('文件不存在,确实删除掉咯');
}

追加文件内容 appendFile

异步:appendFile(file, data[, options], callback)

let fs = require('fs');
fs.appendFile('aaa.txt', '异步追加的内容', (error) => {
	if(error){
		console.error('追加文件内容出错', error);
	}else{
		console.log('追加文件内容成功');
	}
});

异步:appendFileSync(file, data[, options])

let fs = require('fs');
fs.appendFileSync('aaa.txt', '同步追加的内容');
console.log('追加文件内容成功');

读取目录的文件列表 readdir

异步:readdir(path[, options], callback)

let fs = require('fs');
fs.readdir('./', (error, files) => {
	if(error){
		return console.error(error);
	}

	for(let i in files){
		console.log(files[i]);
	}
});

同步:readdirSync(path[, options])

let fs = require('fs');
let files = fs.readdirSync('./');
for(let i in files){
	console.log(files[i]);
}

删除文件 unlink

异步:unlink(path, callback)

let fs = require('fs');
fs.unlink('aaa');

同步:unlinkSync(path)