目录
将Node.js的文件系统、文件流及路径操作API详细的学习了一下,代码都是测试过的,也许很简单,但为了打好基础,还是要有点一丝不苟的精神,从中我也更深入理解异步回调事件机制,希望对你有用……
//公共引用
1. var fs = require('fs'),
2. path = require('path');
1、读取文件readFile函数
//readFile(filename,[options],callback);
/**
* filename, 必选参数,文件名
* [options],可选参数,可指定flag(文件操作选项,如r+ 读写;w+ 读写,文件不存在则创建)及encoding属性
* callback 读取文件后的回调函数,参数默认第一个err,第二个data 数据
*/
1. fs.readFile(__dirname + '/test.txt', {flag: 'r+', encoding: 'utf8'}, function (err, data) {
2. if(err) {
3. console.error(err);
4. return;
5. }
6. console.log(data);
7. });
2、写文件
// fs.writeFile(filename,data,[options],callback);
var w_data = '这是一段通过fs.writeFile函数写入的内容;\r\n';
var w_data = new Buffer(w_data);
/**
* filename, 必选参数,文件名
* data, 写入的数据,可以字符或一个Buffer对象
* [options],flag,mode(权限),encoding
* callback 读取文件后的回调函数,参数默认第一个err,第二个data 数据
*/
1. fs.writeFile(__dirname + '/test.txt', w_data, {flag: 'a'}, function (err) {
2. if(err) {
3. console.error(err);
4. } else {
5. console.log('写入成功');
6. }
7. });
3、以追加方式写文件
// fs.appendFile(filename,data,[options],callback);
1. fs.appendFile(__dirname + '/test.txt', '使用fs.appendFile追加文件内容', function () {
2. console.log('追加内容完成');
3. });
4、打开文件
// fs.open(filename, flags, [mode], callback);
/**
* filename, 必选参数,文件名
* flags, 操作标识,如"r",读方式打开
* [mode],权限,如777,表示任何用户读写可执行
* callback 打开文件后回调函数,参数默认第一个err,第二个fd为一个整数,表示打开文件返回的文件描述符,window中又称文件句柄
*/
1. fs.open(__dirname + '/test.txt', 'r', '0666', function (err, fd) {
2. console.log(fd);
3. });
5、读文件,读取打开的文件内容到缓冲区中;
// fs.read(fd, buffer, offset, length, position, callback);
/**
* fd, 使用fs.open打开成功后返回的文件描述符
* buffer, 一个Buffer对象,v8引擎分配的一段内存
* offset, 整数,向缓存区中写入时的初始位置,以字节为单位
* length, 整数,读取文件的长度
* position, 整数,读取文件初始位置;文件大小以字节为单位
* callback(err, bytesRead, buffer), 读取执行完成后回调函数,bytesRead实际读取字节数,被读取的缓存区对象
*/
1. fs.open(__dirname + '/test.txt', 'r', function (err, fd) {
2. if(err) {
3. console.error(err);
4. return;
5. } else {
6. var buffer = new Buffer(255);
7. console.log(buffer.length);
8. //每一个汉字utf8编码是3个字节,英文是1个字节
9. fs.read(fd, buffer, 0, 9, 3, function (err, bytesRead, buffer) {
10. if(err) {
11. throw err;
12. } else {
13. console.log(bytesRead);
14. console.log(buffer.slice(0, bytesRead).toString());
15. //读取完后,再使用fd读取时,基点是基于上次读取位置计算;
16. fs.read(fd, buffer, 0, 9, null, function (err, bytesRead, buffer) {
17. console.log(bytesRead);
18. console.log(buffer.slice(0, bytesRead).toString());
19. });
20. }
21. });
22. }
23. });
6、写文件,将缓冲区内数据写入使用fs.open打开的文件
//fs.write(fd, buffer, offset, length, position, callback);
/**
* fd, 使用fs.open打开成功后返回的文件描述符
* buffer, 一个Buffer对象,v8引擎分配的一段内存
* offset, 整数,从缓存区中读取时的初始位置,以字节为单位
* length, 整数,从缓存区中读取数据的字节数
* position, 整数,写入文件初始位置;
* callback(err, written, buffer), 写入操作执行完成后回调函数,written实际写入字节数,buffer被读取的缓存区对象
*/
1. fs.open(__dirname + '/test.txt', 'a', function (err, fd) {
2. if(err) {
3. console.error(err);
4. return;
5. } else {
6. var buffer = new Buffer('写入文件数据内容');
7. //写入'入文件'三个字
8. fs.write(fd, buffer, 3, 9, 12, function (err, written, buffer) {
9. if(err) {
10. console.log('写入文件失败');
11. console.error(err);
12. return;
13. } else {
14. console.log(buffer.toString());
15. fs.write(fd, buffer, 12, 9, null, function (err, written, buffer) {
16. console.log(buffer.toString());
17. })
18. }
19. });
20. }
21. });
7、刷新缓存区;
// 使用fs.write写入文件时,操作系统是将数据读到内存,再把数据写入到文件中,当数据读完时并不代表数据已经写完,因为有一部分还可能在内在缓冲区内。
// 因此可以使用fs.fsync方法将内存中数据写入文件;--刷新内存缓冲区;
//fs.fsync(fd, [callback])
/**
* fd, 使用fs.open打开成功后返回的文件描述符
* [callback(err, written, buffer)], 写入操作执行完成后回调函数,written实际写入字节数,buffer被读取的缓存区对象
*/
1. fs.open(__dirname + '/test.txt', 'a', function (err, fd) {
2. if(err)
3. throw err;
4. var buffer = new Buffer('我爱nodejs编程');
5.
6. fs.write(fd, buffer, 0, 9, 0, function (err, written, buffer) {
7. console.log(written.toString());
8. fs.write(fd, buffer, 9, buffer.length - 9, null, function (err, written) {
9. console.log(written.toString());
10. fs.fsync(fd);
11. fs.close(fd);
12. })
13. });
14. });