文件系统(File System)
-
文件系统简单来说就是通过Node来操作系统中的文件
-
在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端
-
Node通过fs模块来和文件系统进行交互
-
该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互。
-
要使用fs模块,首先需要对其进行加载
var fs = require("fs");
同步和异步调用
- fs模块中所以的操作都有两种形式可供选择 同步和异步。
- 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。
- 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。
文件的写入
同步
手动操作的步骤
-
打开文件
fs.openSync(path[, flags, mode])
-
path 要打开文件的路径
-
flags 打开文件要做的操作类型
r 只读的
w 可写的
-
mode 设置文件的操作权限, 一般不传
返回值:
该方法会返回一个文件的描述符作为结果,我们可以通过该描述符来进行各种操作。
var fd = fs.openSync("hello.txt", "w");
-
-
向文件中写入内容
fs.writeSync(fd, string[, position[, encoding]])
-
fd 文件的描述符,需要传递要写入的文件的描述符
-
string 要写入的内容
-
position 写入的起始位置
-
encoding 写入的编码,默认utf-8
fs.writeFileSync(fd, "写入的内容");
-
-
保存并关闭文件
fs.closeSync(fd)
- fd 要关闭的文件的描述符
-
完整代码:
var fs = require("fs"); var fd = fs.openSync("hello.txt", "w"); console.log(fd); fs.writeFileSync(fd, "写入的内容"); fs.closeSync(fd);
异步
- 打开一个文件
fs.open(path[, flags[, mode], callback)
var fs = require("fs");
fs.open("hello2.txt", "w", function(){});
注意: 这里不能用一个变量来保存值,异步没有返回值
-
异步调用的方法,结果都是通过回调函数的参数来返回的
-
回调函数两个参数:
- err 错误对象,如果没有错误则为null
- fd 文件的描述符
-
写入内容,关闭文件,完整代码:
var fs = require("fs"); fs.open("hello2.txt", "w", function(err, fd){ if(!err) { //如果没出错,对文件进行写入操作 fs.write(fd, "这是异步写入的内容", function(err) { if(!err) { console.log("写入成功"); } //关闭文件 fs.close(fd, function(err) { if(!err) { console.log("文件已关闭"); } }) }) }else { console.log(err); } });
简单文件写入
- 异步
fs.writeFile(file, data[, options], callback)
- 同步
fs.writeFileSync(file, data[, options])
-
file 要操作文件的路径
-
data 要写入的数据
-
options 选项,可以对写入进行一些设置(对象作为参数)
-
callback 当写入完成以后执行的函数
-
flag
r 只读
w 可写
a 追加
var fs = require("fs");
fs.writeFile("hello3.txt", "这是writeFile写入的内容", function(err) {
if(!err) {
console.log("写入成功");
}
});
如果不想文本从头写,往后追加内容
fs.writeFile("hello3.txt", "这是writeFile写入的内容", {flag: "a"}, function(err) {
if(!err) {
console.log("写入成功");
}
});
流式文件写入
同步、异步、简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出
fs.createWriteStream(path[, options])
- 可以用来创建一个可写流
- path 文件路径
- options 配置的参数
var fs = require("fs");
//创建一个可写流
var ws = fs.createWriteStream("hello3.txt");
//通过ws向文件中输出内容
ws.write("通过可写流写入的内容");
ws.write("通过可写流写入的内容");
可以通过监听流的open和close时间来监听流的打开和关闭
on(事件字符串,回调函数)
- 可以为对象绑定一个事件
once(事件字符串,回调函数)
- 可以为对象绑定一个一次性的事件,该事件将会触发一次以后自动失效
var fs = require("fs");
//创建一个可写流
var ws = fs.createWriteStream("hello3.txt");
//可以通过监听流的open和close时间来监听流的打开和关闭
ws.once("open", function() {
console.log("流打开了");
});
ws.once("close", function() {
console.log("流关闭了");
});
//通过ws向文件中输出内容
ws.write("通过可写流写入的内容");
ws.write("1111111");
ws.end();
文件的读取
简单文件读取
fs.readFile(path[, options], callback)
fs.readFileSync(path[, options])
- path 要读取的文件的路径
- options 读取的选项
- callback 回调函数,通过回调函数将读取的内容返回(err, data)
- err 错误对象
- data 读取到的数据,会返回一个Buffer
var fs = require("fs");
fs.readFile("hello3.txt", function(err, data) {
if(!err) {
console.log(data);
}
})
流式文件读取
fs.createReadStream(path[, options])
流式文件读取也使用于一些比较大的文件,可以分多次将文件读取到内存中。
var fs = require("fs");
var rs = fs.createReadStream("hello3.txt");
//监听流的开启和关闭
rs.once("open", function() {
console.log("可读流打开了");
});
rs.once("close", function() {
console.log("可读流关闭了");
});
//如果要读取一个可读流中的数据,必须要为可读流绑定一个data事件,data事件绑定完毕,它会自动开始读取数据
rs.on("data", function(data) {
console.log(data);
});
pipe() 可以将可读流中的内容,直接输出到可写流中
var fs = require("fs");
var rs = fs.createReadStream("hello3.txt");
var ws = fs.createWriteStream("hello4.txt");
//监听流的开启和关闭
rs.once("open", function() {
console.log("可读流打开了");
});
rs.once("close", function() {
console.log("可读流关闭了");
});
ws.once("open", function() {
console.log("可写流打开了");
});
ws.once("close", function() {
console.log("可写流关闭了");
});
rs.pipe(ws);
fs中常用的方法
-
验证路径是否存在
fs.existsSync(path);
var fs = require("fs");
var isExists = fs.existsSync("hello3.txt");
console.log(isExists);
-
获取文件的状态
fs.stat(path, callback)
fs.statSync(path)
它会给我们返回一个对象,这个对象中保存了当前对象状态的相关信息。
fs.stat("hello3.txt", function(err, stat) {
console.log(stat.isFile());
})
-
删除文件
fs.unlink(path, callback)
fs.unlinkSync(path)
-
读取一个目录的目录结构
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])
fs.readdir(".", function(err, files) {
if(!err) {
console.log(files);
}
})
-
截断文件
fs.truncate(path[, len], callback)
fs.truncateSync(path[, len])
将文件修改成为指定的大小。
-
创建目录
fs.mkdir(path[, options], callback)
fs.mkdirSync(path[, options])
-
删除目录
fs.rmdir(path[, options], callback)
fs.rmdirSync(path[, options])
-
重命名文件夹
fs.rename("hello2.txt", "hello5.txt", function(err) {
if(!err) {
console.log("修改成功");
}
})
fs.rmdirSync(path[, options])
fs.rename("hello2.txt", "hello5.txt", function(err) {
if(!err) {
console.log("修改成功");
}
})
更多详见:http://nodejs.cn/api/fs.html