Node.js fs 模块

实验简介

fs模块用于对系统文件及目录进行读写操作
参考链接:http://nodejs.org/api/fs.html

一、同步和异步

使用require('fs')载入fs模块,模块中所有方法都有同步和异步两种形式。
异步方法中回调函数的第一个参数总是留给异常参数(exception),如果方法成功完成,那么这个参数为null或者undefined。

异步方法实例代码(无需在虚拟机中编写):
<pre>
var fs = require('fs'); // 载入fs模块
fs.unlink('/tmp/shiyanlou', function(err) {
if (err) {
throw err;
}
console.log('成功删除了 /tmp/shiyanlou');
});
</pre>
同步方法实例代码(无需在虚拟机中编写):
<pre>
var fs = require('fs');

fs.unlinkSync('/tmp/shiyanlou'); // Sync 表示是同步方法
console.log('成功删除了 /tmp/shiyanlou');
</pre>

同步方法执行完并返回结果后,才能执行后续的代码。而异步方法采用回调函数接收返回结果,可以立即执行后续的代码

二、readFile读取文件

使用fs.readFile(filename, [options], callback)
方法读取文件。
readFile接收三个参数,filename是文件名;[options]是可选的参数,为一个对象,用于指定文件编码(encoding)及操作方式(flag);callback是回调函数。



在虚拟机家目录(/home/shiyanlou)下新建一个文件text.txt,文件中的内容如下:
<pre>
line one
line two
</pre>
使用readFile读取此文件,虚拟机家目录下新建文件readfile.js
,输入如下代码并保存:
<pre>
var fs = require('fs'); // 引入fs模块

fs.readFile('./test.txt', function(err, data) {
// 读取文件失败/错误
if (err) {
throw err;
}
// 读取文件成功
console.log(data);
});
</pre>
readFile的回调函数接收两个参数,err是读取文件出错时触发的错误对象,data是从文件读取的数据。
运行程序:
<pre>
shiyanlou:~/ $ node readfile.js
</pre>
会看到输出的内容类似于这样:
<pre><Buffer 6c 69 6e 65 20 6f 6e 65 0a 6c 69 6e 65 20 74 77 6f 0a></pre>
这是原始二进制数据在缓冲区中的内容。要显示文件内容可以使用toString()或者设置输出编码,readFile.js
可以改成这样:

<pre>
var fs = require('fs'); // 引入fs模块
// 使用toString()
fs.readFile('./test.txt', function(err, data) {
// 读取文件失败/错误
if (err) {
throw err;
}
// 读取文件成功
console.log('toString: ', data.toString());
});
// 设置编码格式
fs.readFile('./test.txt', 'utf-8', function(err, data) {
// 读取文件失败/错误
if (err) {
throw err;
}
// 读取文件成功
console.log('utf-8: ', data.toString());
});
</pre>
这样再运行程序就能正常显示出文件中的内容了。
fs.readFileSync(filename, [options])是readFile的同步方法。

三、writeFile写入文件

使用fs.writeFile(filename, data, [options], callback)写入内容到文件。

 writeFile接收四个参数,filename是文件名称;data是要写入文件的数据;
[options]是一个对象为可选参数,包含编码格式(encoding),模式(mode)
以及操作方式(flag);callback是回调函数。
writeFile
writeFile

在虚拟机家目录下新建writeFile.js文件,输入如下代码并保存:
<pre>
var fs = require('fs'); // 引入fs模块

// 写入文件内容(如果文件不存在会创建一个文件)
// 写入时会先清空文件
fs.writeFile('./test2.txt', 'test test', function(err) {
if (err) {
throw err;
}
console.log('Saved.');
// 写入成功后读取测试
fs.readFile('./test2.txt', 'utf-8', function(err, data) {
if (err) {
throw err;
}
console.log(data);
});
});</pre>
运行程序:
<pre>shiyanlou:~/ $ node writeFile.js</pre>
如果要追加数据到文件,可以传递一个flag参数,修改代码为如下所示:
<pre>
var fs = require('fs'); // 引入fs模块

// 写入文件内容(如果文件不存在会创建一个文件)
// 传递了追加参数 { 'flag': 'a' }
fs.writeFile('./test2.txt', 'test test', { 'flag': 'a' }, function(err) {
if (err) {
throw err;
}
console.log('Saved.');
// 写入成功后读取测试
fs.readFile('./test2.txt', 'utf-8', function(err, data) {
if (err) {
throw err;
}
console.log(data);
});
});
</pre>
运行程序:
<pre>shiyanlou:~/ $ node writeFile.js</pre>

   flag传递的值,
  r代表读取文件,
  w代表写入文件,
  a代表追加写入文件,还有其他的值不作详细介绍。

四、使用fs.read和fs.write读写文件

使用fs.read和fs.write.读写文件需要使用fs.open打开文件和fs.close关闭文件。

1、fs.read()

先介绍fs.open(path, flags, [mode], callback)方法,此方法用于打开文件,以便fs.read()读取。

  • path是文件路径
  • [mode]是文件的权限(可选参数,默认值是0666)
  • callback是回调函数。
  • flags是打开文件的方式.flags的值:
  • -r:读取文件,文件不存在时报错;
  • r+:读取并写入文件,文件不存在时报错;
  • rs:以同步方式读取文件,文件不存在时报错;
  • rs+:以同步方式读取并写入文件,文件不存在时报错;
  • w:写入文件,文件不存在则创建,存在则清空;
  • wx:和w一样,但是文件存在时会报错;
  • w+:读取并写入文件,文件不存在则创建,存在则清空;
  • wx+:和w+一样,但是文件存在时会报错;
  • a:以追加方式写入文件,文件不存在则创建;
  • ax:和a一样,但是文件存在时会报错;
  • a+:读取并追加写入文件,文件不存在则创建;
  • ax+:和a+一样,但是文件存在时会报错。

2.fs.close(fd, [callback])

用于关闭文件,fd是所打开文件的文件描述符。
fs.read(fd, buffer, offset, length, position, callback)
方法接收6个参数。

  • fd是文件描述符,必须接收fs.open()方法中的回调函数返回的第二个参数;
  • buffer是存放读取到的数据的Buffer对象;
  • offset指定向buffer中存放数据的起始位置;
  • length指定读取文件中数据的字节数;
  • position指定在文件中读取文件内容的起始位置;
  • callback是回调函数,回调函数的参数:
  • err用于抛出异常;
  • bytesRead是从文件中读取内容的实际字节数;
  • buffer是被读取的缓存区对象。

在家目录中新建文件testread.txt,在文件中随意输入一些内容,然后新建read.js文件,
输入如下代码并保存:
<pre>
var fs = require('fs'); // 引入fs模块
// 打开文件
fs.open('./testread.txt', 'r', function(err, fd) {
if (err) {
throw err;
}
console.log('open file success.');
var buffer = new Buffer(255);
// 读取文件
fs.read(fd, buffer, 0, 10, 0, function(err, bytesRead, buffer) {
if (err) {
throw err;
}
// 打印出buffer中存入的数据
console.log(bytesRead, buffer.slice(0, bytesRead).toString());
// 关闭文件
fs.close(fd);
});
});
</pre>
运行程序:
<pre>shiyanlou:~/ $ node read.js</pre>

3、fs.write()

fs.write(fd, buffer, offset, length, position, callback)方法的参数和fs.read()相同,
buffer是需要写入文件的内容。

在家目录中新建文件testwrite.txt,然后新建write.js文件,输入如下代码并保存:
<pre>
var fs = require('fs'); // 引入fs模块

// 打开文件
fs.open('./testwrite.txt', w, function(err, fd) {
if (err) {
throw err;
}
console.log('open file success.');
var buffer = new Buffer('shiyanlou');
// 读取文件
fs.write(fd, buffer, 0, 6, 0, function(err, written, buffer) {
if (err) {
throw err;
}
console.log('write success.');
// 打印出buffer中存入的数据
var byteLength = buffer.byteLength;
console.log(byteLength, buffer.slice(0, byteLength).toString());
// 关闭文件
fs.close(fd);
});
});
</pre>
运行程序:
<pre>shiyanlou:~/ $ node write.js</pre>

五、目录操作

1、创建目录

使用fs.mkdir(path, [mode], callback)创建目录,

  • path是需要创建的目录,
  • [mode]是目录的权限(默认值是0777),
  • callback 是回调函数。

在家目录下创建mkdir.js文件,输入如下代码并保存:
<pre>
var fs = require('fs'); // 引入fs模块
// 创建 newdir 目录
fs.mkdir('./newdir', function(err) {
if (err) {
throw err;
}
console.log('make dir success.');
});
</pre>
运行代码:
<pre>shiyanlou:~/ $ node mkdir.js</pre>
运行程序后会发现在当前目录下已经创建了newdir目录,删除目录可以使用fs.rmdir(path, callback),但是只能删除空目录。

2、读取目录

使用fs.readdir(path, callback)读取文件目录。
在家目录下新建readdir.js文件,输入如下代码并保存:
<pre>
var fs = require('fs'); // 引入fs模块
fs.readdir('./newdir', function(err, files) {
if (err) {
throw err;
}
// files是一个数组
// 每个元素是此目录下的文件或文件夹的名称
console.log(files);
});
</pre>
运行代码:
<pre>shiyanlou:~/ $ node readdir.js</pre>

六、结束

fs模块中还有很多其他方法,其使用与前面介绍的方法类似,在此不一一介绍,可自行查阅官方API文档。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容