node核心模块--fs
fs模块是文件操作的封装,它提供了文件读取、写入、更名、删除、遍历目录、链接等POSIX文件系统操作。与其它模块不同的是,fs模块中所有的操作都提供了
异步
和同步
的两个版本。
一、文件读取–完整性读写
1、fs.readFile
fs.readFile(filename,[encoding],[callback(error,data)]
是最简单的文件读取函数,它接受一个必选参数filename,表示读取的文件名。
第二个参数encoding是可选的,表示文件字符编码。callback是回调函数,用于接收文件的内容。如果不指定encoding,则callback就是第二个参数。
回调函数提供两个参数err和data,err表示有没有错误发生,data是文件内容。
如果指定encoding,data是一个解析后的字符串,否则将会以Buffer形式表示的二进制数据。
demo11
2
3
4
5
6
7
8
9
10
11const fs = require('fs');
fs.readFile('./file/readFile.txt','utf8', function(err, data) {
if (err) {
throw err;
}
// 读取文件成功
console.log('异步测试: -->'+data);
});
//同步
var data=fs.readFileSync('./file/readFile.txt','utf-8');
console.log('同步测试:-->'+data);
2、fs.writeFile
fs.writeFile(filename,data,[options],callback)
用来写文件,其中options为对象,有以下几个值:1
2
3encoding {String | null} default='utf-8'
mode {Number} default=438(aka 0666 in Octal)
flag {String} default='w'
这里主要flag值,默认为w,会清空文件,然后再写。flag值,r代表读取文件
,w代表写文件
,a代表追加。
demo21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25const fs = require('fs');
// 写入文件内容(如果文件不存在会创建一个文件)
// 写入时会先清空文件
fs.writeFile('./file/writeFile.txt', '写入成功:hello world', function(err) {
if (err) {
throw err;
}
// 写入成功后读取测试
var data=fs.readFileSync('./file/writeFile.txt', 'utf-8');
console.log('new data -->'+data);
});
// 数据追加
setTimeout(function(){
// 追加
fs.writeFile('./file/writeFile.txt', '这里是追加的数据', {'flag':'a'},function(err) {
if (err) {
throw err;
}
console.log('success');
var data=fs.readFileSync('./file/writeFile.txt', 'utf-8')
// 写入成功后读取测试
console.log('追加后的数据 -->'+data);
});
},1000);
3、fs.appendFile
fs.appendFile(filename, data, [options], callback)
该方法以异步的方式将 data 插入到文件里,如果文件不存在会自动创建。data可以是任意字符串或者缓存。
与fs.writeFile
方法差别就是 [options]的flag默认值是”a”,所以它以追加方式写入数据.
demo31
2
3
4
5
6
7
8
9
10const fs = require('fs');
// 写入文件内容(如果文件不存在会创建一个文件)
fs.appendFile('./file/appendFile.txt', '新数据456', function(err) {
if (err) {
throw err;
}
// 写入成功后读取测试
var data=fs.readFileSync('./file/appendFile.txt', 'utf-8');
console.log(data);
});
4、删除文件 unlink
比较简单,没啥好说的,直接上demo
demo41
2
3
4
5const fs =require('fs');
fs.unlink('./file/unlink.txt',function(err){
if(err) return;
console.log('成功删除了unlink.txt这个文件');
});
二、文件读取-指定位置读写
这个跟上面的过程相比,流程稍微麻烦一点点,要先用fs.open来打开文件,然后才可以用fs.read去读,或者用fs.write去写文件,最后,你需要用fs.close去关掉文件。
1、fs.open
用法:fs.open(path,flags,[mode],callback)
- path 文件路径
- flags打开文件的方式
flags部分值为(没全部列出,需要的话去查即可):r:以读取模式打开文件
r+:以读写模式
w:以写入模式打开,如果不存在则创建
w+:以读写模式打开,如果不存在则创建
a:以追加模式打开文件,如果不存在则创建
a+:以读取追加模式打开文件,如果文件不存在则创建。
- [mode] 是文件的权限(可选参数,默认值是0666)
- callback 回调函数
demo51
2
3
4const fs = require('fs');
fs.open('./file/open.txt','r','0666',function(err,fd){
console.log(fd); //返回的第二个参数为一个整数,表示打开文件返回的文件描述符,window中又称文件句柄
})
2、fs.read
用法fs.read(fd, buffer, offset, length, position, callback);
- fd, 使用fs.open打开成功后返回的文件描述符
- buffer, 一个Buffer对象,v8引擎分配的一段内存
- offset, 整数,向缓存区中写入时的初始位置,以字节为单位
- length, 整数,读取文件的长度
- position, 整数,读取文件初始位置;文件大小以字节为单位
- callback(err, bytesRead, buffer), 读取执行完成后回调函数,bytesRead:实际读取字节数,buffer:被读取的缓存区对象
demo61
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23fs.open('./file/open.txt', 'r', function (err, fd) {
if(err) {
return;
} else {
var buffer = new Buffer(255);
//每一个汉字utf8编码是3个字节,英文是1个字节
fs.read(fd, buffer, 0, 9, 0, function (err, bytesRead, buffer) {
if(err) {
throw err;
} else {
console.log(bytesRead);
console.log(buffer.slice(0, bytesRead).toString());
//读取完后,再使用fd读取时,基点是基于上次读取位置计算;
fs.read(fd, buffer, 0, 20, null, function (err, bytesRead, buffer) {
console.log(bytesRead);
console.log(buffer.slice(0, bytesRead).toString());
});
}
});
}
});
3、fs.write
用法fs.write(fd, buffer, offset, length, position, callback);
- fd, 使用fs.open打开成功后返回的文件描述符
- buffer, 一个Buffer对象,v8引擎分配的一段内存
- offset, 整数,从缓存区中读取时的初始位置,以字节为单位
- length, 整数,从缓存区中读取数据的字节数
- position, 整数,写入文件初始位置;
- callback(err, written, buffer), 写入操作执行完成后回调函数,written实际写入字节数,buffer被读取的缓存区对象
demo71
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24const fs = require('fs');
fs.open(__dirname + '/file/open.txt', 'a', function (err, fd) {
if(err) {
console.error(err);
return;
} else {
var buffer = new Buffer('写入文件数据内容');
//写入'入文件'三个字
fs.write(fd, buffer, 3, 9, 12, function (err, written, buffer) {
if(err) {
console.log('写入文件失败');
console.error(err);
return;
} else {
console.log(buffer.toString());
//写入'数据内'三个字
fs.write(fd, buffer, 12, 9, null, function (err, written, buffer) {
console.log(buffer.toString());
})
}
});
}
});
fs.close
用法fs.close(fd,callback)
- fd 文件open时传递的文件描述符
- callback 回调函数
三、目录操作
1、fs.mkdir创建目录
demo51
2
3
4
5const fs = require('fs');
fs.mkdir('./mkdir',function(err){
if(err) return;
console.log('创建目录成功');
})
2、fs.rmdir删除目录
demo81
2
3
4
5const fs = require('fs');
fs.rmdir('./mkdir',function(err){
if(err) return;
console.log('删除目录成功');
})
3、fs.readdir读取目录
返回的data为一个数组,包含该文件夹的所有文件
demo91
2
3
4
5
6const fs = require('fs');
fs.readdir('./file',function(err,data){
if(err) return;
//data为一个数组
console.log('读取的数据为:'+data[0]);
});
四、链接文件操作
1、fs.link 创建一个链接
fs.link(srcpath, dstpath, [callback(err)])
srcpath
为源文件目录或文件的路径dstpath
为转换后的路径
可以理解为复制了一份文件到另一个文件,比如下面的demo8,我们在file文件有一个link.txt,执行后,file文件里面生成了linkFile文件,而且两者的内容是一样的,或者说是源文件的备份
进一步理解
fs.link(srcpath, dstpath, [callback])
、和 fs.symlink(linkdata, path, [callback])
建立文件链接,除非回调函数执行过程出现了异常,否则不会传递任何参数。link和symlink的区别是: link 创建的是hard link
所谓硬链接; symlink创建的是symbolic link
所谓符号链接 硬链接就是备份,软连接就是快捷方式
demo101
2
3
4const fs = require('fs');
fs.link('./file/link.txt','./file/linkFile.txt',function(err){
if(err) return;
})
fs.readlink、fs.realpath、fs.unlink
fs.readlink(path, [callback])
读取链接源地址,注意:读取的是软连接中的实际中文名,也就是symlink设置的软连接fs.realpath(path, [callback])
获取当前目录或者文件的绝对路径fs.unlink(path, [callback])
删除某一个文件链接(删除的是硬链接)
demo111
2
3
4
5
6
7
8
9
10
11
12const fs = require('fs');
// readlink
fs.readlink('./file/link2.txt',function(err,data){
console.log(data); //.\file\link.txt 返回创建它的软链接,这里,link2是由link创建的软链接
});
// realpath
fs.realpath('./file/linkFile.txt', function (err, resolvedPath) {
if (err) throw err;
console.log(resolvedPath);
//F:\myFile\express\express-study\fs\fsTest\file\linkFile.txt 返回绝对路径
});
五、watchfile(),unwatchfile()
watchfile方法监听一个文件,如果该文件发生变化,就会自动触发回调函数。
demo121
2
3
4
5
6
7
8
9
10
11
12var fs = require('fs');
fs.watchFile('./testFile.txt', function (curr, prev) {
console.log('the current mtime is: ' + curr.mtime);
console.log('the previous mtime was: ' + prev.mtime);
});
fs.writeFile('./testFile.txt', "changed", function (err) {
if (err) throw err;
console.log("file write complete");
});
unwatchfile方法用于解除对文件的监听。
后记,当然,fs的方法不止上面我列的这些,其他需要用到的话还需要去查。另外,有一个 fs-extra
模块也不错,扩展了fs的一些方法。可以去查查