Node.js 初识 fs 模块
fs 模块是文件操作的封装,它提供了文件的读取、写入、更名、删除、遍历目录、链接等 Unix 文件系统操作。与其他模块不同的是,fs 模块中所有的操作都提供了 同步 和 异步 两个版本,比如读取文件内容的函数有 异步的 fs.readFile() 和 同步的 fs.readFileSync().
Node.js 导入文件系统模块的语法如下:
var fs = require('fs');
1、异步和同步读取文件
fs.readFile(file[, options], callback(err,data))
异步读取文件的全部内容
参数:
file:
options:
encoding:
flag:
callback:
如果指定了第二个参数 encoding,回调函数中的 data 是一个解析后的字符串,否则 data 将会是以 Buffer 形式表示的二进制数据
新建一个 content.txt,里面添加一行简单的文本
你好,世界!
异步读取文件,示例代码如下:
var fs = require('fs');fs.readFile('./content.txt', {flag: 'r+', encoding: 'utf8'}, function(err, data){ if(err){ console.error(err); return; } console.log('异步读取:'+ data);});
运行结果如下:
当读取文件出现错误时,err 将会是 Error 对象。例如:读取一个不存在的 content1.txt 文件,运行代码时,会报如下错误。
Node.js 的异步编程接口习惯是以函数的最后一个参数为回调函数,通常一个函数只有一个回调函数。回调函数的实际参数中第一个是 err,其余参数是其他返回内容。如果没有发生错误,err 的值会是 null 或 undefined。如果有错误发生,err 通常是 Error 对象的实例
fs.readFileSync(file[, options])
fs.readFile
的同步版本,返回文件的内容
它接受的参数和 fs.readFile 相同,而读取到的文件内容会以函数返回值的形式返回。如果有错误发生,fs 将会抛出异常,需要使用 try 和 catch 捕捉并处理异常。
与同步 I/O 函数不同,Node.js 中异步函数大多没有返回值
同步读取文件示例:
var fs = require('fs');//同步读取var data = fs.readFileSync('./content.txt','utf8');console.log('同步读取:'+ data);console.log('程序执行完毕!');
运行结果:
2、获取文件信息
fs.stat(path, callback)
通过异步模式获取文件信息
参数:
path:
callback: fs.Stats
对象
fs.stat() 执行后,会将 stats 类的实例返回给其回掉函数。可以通过 stats 类中提供的方法判断文件的相关属性,例如:判断是否为文件夹
var fs = require('fs');fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) { console.log(stats.isFile()); //true})
stats 类中的方法有:
新建一个 js 文件,代码如下:
var fs = require('fs');console.log('准备打开文件!');fs.stat('./content.txt', function(err, stats){ if(err){ console.err(error); } console.log(stats); console.log('读取信息成功!'); //检测文件类型 console.log('是否为文件(isFile)?'+ stats.isFile()); console.log('是否为目录(isDirectory)?'+ stats.isDirectory());})
运行结果:
3、写入文件
fs.writeFile(file, data[, options], callback)
异步的方式把数据写入文件,如果文件存在,该方法写入的内容会覆盖旧的文件内容
参数:
file:
data:
options:
encoding:
mode:
flag:
callback:
如果 data 是一个
示例代码:
var fs = require('fs');console.log('准备写入文件!');fs.writeFile('./content.txt', '我是异步写入的文件内容', function(err){ if(err){ console.err(error); } console.log('数据写入成功!'); console.log('--------------我是分割线---------------'); console.log('读取写入的数据!'); fs.readFile('./content.txt', function(err, data){ if(err){ console.err(error); } console.log('异步读取文件数据:' +data); })})
运行结果:
同时,原来的 content.txt 中的内容变为:
fs.appendFile(file, data[, options], callback)
以追加的方式写入文件
示例代码:
var fs = require('fs');fs.appendFile('./content.txt', '我是被追加写入的数据', function(err){ if(err){ console.log(error); }});fs.readFile('./content.txt', function(err, data){ if(err){ console.log(error); } console.log('异步读取文件数据:' +data);})
运行结果:(在原数据后追加数据,不会覆盖原内容)
4、读取文件
fs.read(fd, buffer, offset, length, position, callback(err, bytesRead, buffer))
从指定的文件描述符 fd 中读取数据并写入 buffer 指向的缓冲区对象
参数:
fd :
buffer :
offset :
length :
position :
如果 position 为 null,将从当前文件指针的位置读取
callback :
- err:错误信息
- bytesRead:表示读取的字节数
- buffer:缓冲区对象
示例代码如下:
var fs = require('fs');var buf = new Buffer(1024);console.log('准备打开已存在的文件!');fs.open('./content.txt', 'r+', function(err, fd){ if(err){ console.error(err); } console.log('文件打开成功!'); console.log('准备读取文件:'); fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){ if(err){ console.error(err); } //每一个汉字utf8编码是3个字节 console.log(bytes+ '字节被读取'); //仅输出读取的字节 if(bytes >0){ console.log(buf.slice(0, bytes)); } })});
运行结果:
5、打开文件
fs.open(path, flags[, mode], callback(err, fd))
异步的方式打开文件
path:
flags:
mode:
callback:
flags 参数可以是以下值:
示例代码:以读写模式打开文件 content.txt
var fs = require('fs');//异步打开文件console.log('准备打开文件!');fs.open('./content.txt','r+',function(err, fd){ if(err){ return console.error(err); } console.log('文件打开成功!');});
运行结果:
fs.openSync(path, flags[, mode])
fs.open()
的同步版本,返回一个
6、创建目录
fs.mkdir(path[, mode], callback(err))
创建目录
参数:
path :
[mode] :
callback :
示例代码:
var fs = require('fs');console.log('创建目录 /src/test');fs.mkdir('src/test', function(err){ if(err){ console.error(err); } console.log('目录创建成功!');});
创建前截图:
创建后截图: